Programing

MVC-RedirectToAction ()으로 데이터 전달

lottogame 2020. 12. 9. 07:41
반응형

MVC-RedirectToAction ()으로 데이터 전달


MVC 사용자 양식에 입력 한 데이터를 다른보기에 표시하고 싶습니다.

클래스에는 다음과 같은 개인 변수가 있습니다.

IList<string> _pagecontent = new List<string>();

다음 작업은 FormCollection 개체를 수락하고 유효성을 검사 한 다음 "미리보기"보기에 목록으로 전달합니다.

[Authorize(Roles = "Admins")]
[ValidateInput(false)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UpdateContent(FormCollection collection)
{
    if (ModelState.IsValid)
    {
        string PageToInsert = collection["PageToInsert"];
        string PageHeader = collection["PageHeader"];
        string PageBody = collection["PageBody"];

        //validate, excluded...

        _pagecontent.Add(PageToInsert);
        _pagecontent.Add(PageHeader);
        _pagecontent.Add(PageBody);

    }
    return RedirectToAction("Preview", _pagecontent);
}

미리보기보기에는 강력한 형식의 개체 목록을 전달하기위한 다음 페이지 지시문이 있습니다.

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Template.Master" Inherits="System.Web.Mvc.ViewPage<List<string>>" %>

Model 개체를 사용하여 데이터를 가져올 수있을 것으로 기대하지만 아쉽게도 그렇게 할 수 없습니다. 다음 줄 error index out of bounds에서 인덱스가 음수가 아니고 컬렉션 크기보다 작아야한다는 예외 발생합니다.

<% if (Model[0].ToString() == "0") { %>

URL에 몇 가지 이상한 매개 변수가 추가되었습니다. http://localhost:1894/Admin/Preview?Capacity=4&Count=3

그래서 두 가지 질문이 있습니다.

  1. RedirectToAction을 호출하고 내 List를 전달할 때 뷰의 Model 개체에서 액세스 할 수없는 이유는 무엇입니까?
  2. 내가하려는 일을 수행하는 적절한 방법은 무엇입니까? 즉, 문자열 컬렉션을 뷰에 전달하여 거기에 표시합니까?

TempData를 사용해보십시오. 단일 샷 세션 개체와 같습니다. 원하는 값을 TempData에 넣고 즉시 리디렉션하여 꺼내십시오. 여기에 좋은 글이 있습니다 : http://blogs.teamb.com/craigstuntz/2009/01/23/37947/


TempData를 사용할 때주의하십시오. 단일 서버 환경에서는 훌륭하게 작동하지만 클라우드 환경에서는 요청이 동일한 시스템에 도달한다는 것을 보장 할 수 없기 때문에 예상대로 작동하지 않을 수 있습니다. 이는 TempData가 asp.net 세션에 의존하기 때문에 발생합니다. 그러나 SQL 또는 AppFabric Cache와 같은 다른 세션 관리자를 사용하는 경우 제대로 작동합니다.


RedirectAction의 두 번째 매개 변수는 모델이 아닌 routeValues입니다.

protected internal RedirectToRouteResult RedirectToAction(string actionName, object routeValues);

모델에 TempData를 사용해보십시오. 리디렉션간에 데이터를 유지하기위한 것입니다.


RedirectToAction의 문제는 HTTP 302를 반환하고 브라우저가 자체적으로 새로운 HTTP 요청을 수행한다는 것입니다. 요청간에 데이터를 유지하기 위해 쿠키 및 / 또는 세션 개체를 사용하는 것이 좋습니다.


RedirectToAction이 실제로 Http 302를 브라우저에 다시 보내므로 작동하지 않습니다. 브라우저가이 302를 수신하면 서버에 새 페이지를 요청하는 새 요청을 수행합니다. 새로운 요청, 새로운 임시 변수.

또한 무언가를 저장 / 편집 / 삭제하려고 할 때이 문제가 발생하고 어떤 이유로 든이를 거부하고 이전 양식을 다시 반환해야합니다.

따라서 대신 :

return RedirectToAction("Preview", _pagecontent);

미리보기 논리를 별도의 메서드에 넣고 호출하기 만하면됩니다.

return PreviewLogic(_pagecontent);

또한 TempData [] dic를 사용하여 다른 사람들이 말한 것처럼 다음 요청에 대한 데이터를 유지할 수 있지만 서버에 대한 302 추가 왕복을 피할 수는 없습니다.


다음과 같이하려는 것 같습니다.

public ActionResult UpdateContent(FormCollection form) {
    ...
    return View("Preview", _pagecontent);
}

리디렉션은 브라우저에 대한 "깨끗한 슬레이트"로 간주됩니다 (인증 쿠키와 같은 항목 제외). 다음 요청은 독자적으로 수행 할 수 있어야하기 때문에 브라우저에 다음 요청에 정보를 전달하도록 지시 할 수 없습니다. 다음으로 요청할 URL을 브라우저에 알리기 만하면됩니다. ASP.NET MVC에서 arguments-object를에 전달하면 RedirectToAction해당 개체의 공용 속성이 생성 된 URL에 쿼리 문자열 매개 변수로 추가됩니다.


같은 이름으로 2 개의 작업 결과를 만들고 그중 1 개를 HttpPost로 표시하면 안 되나요?

    public ActionResult UpdateContent(FormCollection preview = null)
    {
        return View(preview);
    }
    [HttpPost]
    public ActionResult UpdateContent(FormCollection collection = null, bool preview = false)
    {
        if (preview)
            return UpdateContent(collection);
        else
            return UpdateContent(null);
    }

It looks like you are looking for the UpdateModel command:

Check out ScottGu's blog post on the topic:

Improved UpdateModel and TryUpdateModel methods

참고URL : https://stackoverflow.com/questions/672143/mvc-passing-data-with-redirecttoaction

반응형