요청 데이터 손실없이 ASP.NET MVC에서 RedirectToAction하는 방법 검사 오류가 발생하여 양식으로 다시

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

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

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



답변

해결책은 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);
}

답변

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


답변

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

using MvcContrib.Filters;

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

답변

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

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 유효성 검사 프레임 워크 에서이 패턴을 쉽게 만들려고합니다 .


답변

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

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

답변

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

Employee employee = new Employee
                {
                        EmpID = "121",
                        EmpFirstName = "Imran",
                        EmpLastName = "Ghani"
                };
                TempData["Employee"] = employee;