С тех пор, как я его использовал, я понял, что в MVC все, что вы помещаете в TempData, является... ну, временным. Он существует только на время текущего запроса, а затем исчезает, когда запрос завершен и ответ отправлен.
Чтобы сохранить ошибки состояния модели в цикле POST-Redirect-GET, я использовал ответ asgeo1, опубликованный здесь:
ASP.NET MVC — как сохранить ошибки ModelState при использовании RedirectToAction ?
Я думал, что это работает хорошо, но обнаружил в моем последнем проекте (VS 2015), что временные данные действительно сохраняются.
Сценарий: пользователь вводит значение в текстовый ввод в поиске, отправляет сообщение и перенаправляется на другую страницу, Index. Затем они нажимают ссылку обратно в Поиск.
Поиск.cshtml:
@model Foo.Models.TestModel
<form method="post" action="@Url.Content("~/Home/Search")">
@Html.TextBoxFor(o => o.TestString)
<input name="find" type="submit" value="Search" />
</form>
Индекс.cshtml:
<a href="@Url.Content("~/Home/Search")">Search</a>
Контроллер:
[HttpGet]
[RestoreModelStateFromTempData]
public ActionResult Search(TestModel model)
{
//var modelState = TempData["ModelState"] as ModelStateDictionary;
//if (modelState != null)
// throw new Exception("Temp Data should be empty.");
return View(model);
}
[HttpPost]
[SetTempDataModelState]
public ActionResult Search(TestModel_Post model)
{
return RedirectToAction("Index", "Home", null);
}
[HttpGet]
public ActionResult Index() { return View(); }
К моему удивлению, временные данные из предыдущего поста сохраняются, а состояние модели из него объединяется, и пользователь видит последнее введенное значение. Это новая навигация на эту страницу — здесь не должно быть временных данных.
Обходной путь — очистить состояние модели, если оно допустимо. Но это было для меня настоящим шоком - я больше не понимаю TempData.
Что тут происходит?