Временные данные MVC сохраняются через отдельные запросы страниц?

С тех пор, как я его использовал, я понял, что в 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.

Что тут происходит?


person PJ7    schedule 19.06.2019    source источник


Ответы (1)


Вы ошибаетесь между ViewData и TempData.

ViewData только передает данные из контроллера в представление, а не наоборот. Он действителен только во время текущего запроса. ViewData полезен при передаче данных из Controller в View.

TempData в ASP.NET MVC можно использовать для хранения временных данных, которые можно использовать в последующем запросе. TempData будет очищен после завершения последующего запроса.

TempData полезен, когда вы хотите передать неконфиденциальные данные из одного метода действия в другой метод действия того же или другого контроллера, а также redirects

person Hien Nguyen    schedule 20.06.2019
comment
Но, по-видимому, ни ViewData, ни ViewBag не могут (тривиально) сохранять ошибки проверки, я думаю, именно поэтому все решения, которые я вижу, используют TempData. - person PJ7; 20.06.2019