MVC 临时数据通过单独的页面请求持续存在?

MVC temp data persists through separate page requests?

据我所知,自从我使用它以来,在 MVC 中,您放入 TempData 的任何内容都是……好吧,临时的。它仅在当前请求期间存在,然后在请求完成并发送响应时消失。

为了通过 POST-Redirect-GET 循环保留模型状态错误,我在此处使用了 asgeo1 的回答 post:

ASP.NET MVC - How to Preserve ModelState Errors Across RedirectToAction?

我认为这很有效,但在我的最新项目 (VS 2015) 中发现临时数据实际上仍然存在。

场景:用户在搜索中的文本输入中输入一个值,提交 post 并被重定向到另一个页面,索引。然后他们单击 link 返回搜索。

Search.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>

Index.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(); }

令我惊讶的是,之前 post 的临时数据被保留,模型状态被合并,用户看到他们输入的最后一个值。这是该页面的全新导航 - 这里应该没有临时数据。

解决方法是清除有效的模型状态。但这让我非常震惊 - 我觉得我不再了解 TempData。

这是怎么回事?

你在 ViewData 和 TempData 之间搞错了。

ViewData 仅将数据从控制器传输到视图,而不是 vice-versa。仅在当前请求期间有效。 ViewData 可用于将数据从 Controller 传输到 View

TempData in ASP.NET MVC可用于存储临时数据,可在后续请求中使用。 TempData 将在 后续请求完成后被清除。

TempData 当您想要将 non-sensitive 数据从一个操作方法传输到相同或不同控制器的另一个操作方法以及 redirects