MVC临时数据通过单独的页面请求是否持久?

时间:2019-06-19 19:23:30

标签: asp.net-mvc tempdata post-redirect-get

自从我一直在使用它,这是我的理解,在MVC中,您在TempData中放置的任何内容都是...暂时的。它仅在当前请求的持续时间内存在,然后在请求完成并发送响应后消失。

为了通过POST-Redirect-GET周期保留模型状态错误,我使用了 asgeo1 的答案发布在这里:

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

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

场景:用户在“搜索”中输入的文本中输入值,提交帖子,然后重定向到另一个页面“索引”。然后,他们单击链接返回到搜索。

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

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

一种解决方法是清除模型状态(如果有效)。但这令我震惊-我觉得我不再了解TempData。

这是怎么回事?

1 个答案:

答案 0 :(得分:0)

您在ViewData和TempData之间是错误的。

ViewData仅将数据从控制器传输到视图,反之亦然。仅在当前请求期间有效。 ViewData可用于将数据从Controller传输到View

ASP.NET MVC中的

TempData可用于存储可在后续请求中使用的临时数据。 后续请求完成后

,TempData将被清除。

TempData在要将非敏感数据从一种动作方法转移到相同或不同控制器以及redirects

的另一种动作方法时非常有用。