요청 데이터 손실없이 ASP.NET MVC에서 RedirectToAction하는 방법


123

ASP.NET MVC를 사용하면 양식 제출과 같은 상황에서 RedirectToAction .

이러한 상황 중 하나는 양식 제출 후 유효성 검사 오류가 발생하여 양식으로 다시 리디렉션해야하지만 URL이 제출하는 작업 페이지가 아닌 양식의 URL을 반영하려는 경우입니다.

POST사용자 편의와 유효성 검사 목적을 위해 양식에 원래 ed 데이터 를 포함해야하므로 어떻게 데이터를 RedirectToAction()? viewData 매개 변수를 사용하면 매개 POST변수가 매개 변수로 변경됩니다 GET.


유사한 질문이 있습니다 (동일한 주제에 대해). 그러나이 질문과 다릅니다. 어쨌든,이 질문에 관심이있는 사람들에게는 여전히 흥미로울 수 있습니다. http://stackoverflow.com/questions/129335/how-do-you-redirecttoaction-using-post-intead-of-get
Chris Pietschmann

오류가있는 경우 동일한 뷰를 반환하지 않는 이유는 무엇입니까? RedirectToAction은 일반적으로 모델이 유효한 경우 호출됩니다. 아니면 뭔가 빠졌나요?!
niico

답변:


81

해결책은 TempData 속성을 사용하여 원하는 요청 구성 요소를 저장하는 것입니다.

예를 들면 :

public ActionResult Send()
{
    TempData["form"] = Request.Form;
    return this.RedirectToAction(a => a.Form());
}

그런 다음 "양식"작업에서 다음을 수행 할 수 있습니다.

public ActionResult Form()
{
    /* Declare viewData etc. */

    if (TempData["form"] != null)
    {
        /* Cast TempData["form"] to 
        System.Collections.Specialized.NameValueCollection 
        and use it */
    }

    return View("Form", viewData);
}

1
RedirectToAction (a => a.Form ())이 MVCv2를 사용하여 컴파일되지 않습니다. MVCv3을 사용하고 있습니까?
ChrisAnnODell 2010

1
이것은 MVC1 이전 (2008)이었습니다. 람다는 내가 믿는 어느 단계에서 제거되었습니다 (이를 재 도입하는 codeplex 프로젝트 MVCContrib이 있지만 해당 단계에서 helper 속성을 사용할 수 있습니다 : stackoverflow.com/questions/1936/… ). mvc2에서는 RedirectToAction ( "Form"), 즉 이름을 문자열로 갈 수 있어야합니다. 비록 MVC 2 또는 3이 MVCContrib에서와 유사한 도우미 속성을 도입 한 것을 느슨하게 기억하지만 검색을 원하면 MVCContrib과 유사한 속성을 도입했습니다.
Matt Mitchell

37

TempData는 양식 컬렉션을 세션에 저장합니다. 이 동작이 마음에 들지 않으면 새로운 ITempDataProvider 인터페이스를 구현하고 임시 데이터를 저장하기위한 다른 메커니즘을 사용할 수 있습니다. 세션 상태의 사용이 당신을 해치고 있다는 사실을 (측정과 프로파일 링을 통해) 알지 못한다면 그렇게하지 않을 것입니다.


13

MVCContrib을 살펴보면 다음과 같이 할 수 있습니다.

using MvcContrib.Filters;

[ModelStateToTempData]
public class MyController : Controller {
    //
    ...
}

8

임시 데이터를 피하는 또 다른 방법이 있습니다. 내가 좋아하는 패턴은 원래 렌더링과 유효하지 않은 형식의 다시 렌더링 모두에 대해 하나의 작업을 만드는 것과 관련이 있습니다. 다음과 같이 진행됩니다.

var form = new FooForm();

if (request.UrlReferrer == request.Url)
{
     // Fill form with previous request's data
}

if (Request.IsPost())
{
     if (!form.IsValid)
     {
         ViewData["ValidationErrors"] = ...
     } else {
         // update model
         model.something = foo.something;
         // handoff to post update action
         return RedirectToAction("ModelUpdated", ... etc);
     }
}

// By default render 1 view until form is a valid post
ViewData["Form"] = form;
return View();

그것은 어느 정도 패턴입니다. 약간 가짜. 이를 통해 양식 렌더링, 값 다시 표시 (양식이 이전 값으로 채워지기 때문에)를 처리하고 오류 메시지를 표시하는 1 개의보기를 만들 수 있습니다.

이 작업에 게시 할 때 유효한 경우 다른 작업으로 제어권이 이전됩니다.

MVC에 대한 지원을 구축하면서 .net 유효성 검사 프레임 워크 에서이 패턴을 쉽게 만들려고합니다 .


저는 TempData도 사용합니다. 제가 이해하는 문제는 Deeno의 솔루션에서 사용자가 잘못된 데이터를 게시 한 후 페이지를 새로 고치면 "양식 데이터를 다시 제출 하시겠습니까"라는 확인 메시지가 표시된다는 것입니다. MattMitchell이 ​​말한대로 TempData 솔루션을 사용하면이 문제가 해결됩니다.
user10479

멋있는. 누군가가 미리보기 5 에서도이 기본 아이디어를 발견 한 것 같습니다.
Matt Mitchell

2

리디렉션 된 작업에 데이터를 전달하려는 경우 사용할 수있는 방법은 다음과 같습니다.

return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like  public ActionResult ModelUpdated(int id);

0

TempData는 행동에서 행동으로 데이터를 유지하는 솔루션입니다.

Employee employee = new Employee
                {
                        EmpID = "121",
                        EmpFirstName = "Imran",
                        EmpLastName = "Ghani"
                };
                TempData["Employee"] = employee;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.