Мой сценарий немного сложнее, так как я использую шаблон PRG, поэтому моя ViewModel ("SummaryVM") находится в TempData, и мой экран Summary отображает его.На этой странице есть небольшая форма для размещения некоторой информации в другом действии.Сложность возникла из-за того, что пользователь должен отредактировать некоторые поля в SummaryVM на этой странице.
Summary.cshtml содержит сводку проверки, которая будет перехватывать ошибки ModelState, которые мы создадим.
@Html.ValidationSummary()
Моя форма теперь должна POST к действию HttpPost для Summary ().У меня есть еще одна очень маленькая ViewModel для представления отредактированных полей, и привязка к модели получит их мне.
Новая форма:
@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 и добавляет их в состояние модели.
[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);
}
}