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;