当我使用PRG模式时,我的场景会稍微复杂一些,因此我的ViewModel(“ SummaryVM”)在TempData中,并且“摘要”屏幕会显示它。此页面上有一个小表格,可将一些信息发布到另一个Action。复杂性来自于要求用户在此页面上编辑SummaryVM中的某些字段。
Summary.cshtml具有验证摘要,该摘要将捕获我们将创建的ModelState错误。
@Html.ValidationSummary()
我的表单现在需要发布到Summary()的HttpPost操作。我还有另一个非常小的ViewModel来代表已编辑的字段,而Modelbinding会将它们交给我。
新表格:
@using (Html.BeginForm("Summary", "MyController", FormMethod.Post))
{
@Html.Hidden("TelNo") @* // Javascript to update this *@
和动作...
[HttpPost]
public ActionResult Summary(EditedItemsVM vm)
在这里,我进行了一些验证,并检测到一些错误的输入,因此我需要返回包含错误的“摘要”页面。为此,我使用TempData,它将在重定向后保留下来。如果数据没有问题,我将SummaryVM对象替换为一个副本(但是当然更改了已编辑的字段),然后执行RedirectToAction(“ NextAction”);
// Telephone number wasn't in the right format
List<string> listOfErrors = new List<string>();
listOfErrors.Add("Telephone Number was not in the correct format. Value supplied was: " + vm.TelNo);
TempData["SummaryEditedErrors"] = listOfErrors;
return RedirectToAction("Summary");
所有这一切开始的Summary控制器操作将查找tempdata中的任何错误,并将其添加到modelstate中。
[HttpGet]
[OutputCache(Duration = 0)]
public ActionResult Summary()
{
// setup, including retrieval of the viewmodel from TempData...
// And finally if we are coming back to this after a failed attempt to edit some of the fields on the page,
// load the errors stored from TempData.
List<string> editErrors = new List<string>();
object errData = TempData["SummaryEditedErrors"];
if (errData != null)
{
editErrors = (List<string>)errData;
foreach(string err in editErrors)
{
// ValidationSummary() will see these
ModelState.AddModelError("", err);
}
}