将数据从控制器传递到视图 MVC 时为 Null TempData

Null TempData when passing data from controller to view MVC

我在向视图传递数据的控制器中有以下 class:

public ActionResult ControllerToView(){
    ...
    TempData["example"] = "this is a message!";
    ...
    return Redirect("http://myViewPageLink");
}

在我看来,我正在尝试通过以下方式访问 TempData 字典:

@if(myCondition){
    var test = TempData["example"];
    <p>@test</p>
}

"myCondition" 总是满足,但 TempData 字典总是空的。任何想法为什么?为了使 TempData 在视图中可用,我是否必须编写任何附加代码?

在调用我的控制器方法之前,我对同一控制器中的另一个方法有一个 ajax 请求,这可能是有用的信息。

你应该知道 TempDataDictionary 用于短期实例。当下一个请求肯定重定向到下一个视图(适用于一次性消息)时,它的值在当前和后续请求期间可用。您分配给 TempDataDictionary 的任何值都将在后续请求 完成后被丢弃,如 "normal read".

因此您当前的请求包含以下序列:

  1. 请求 => ActionResult (ControllerToView)
  2. 设置TempDataDictionary
  3. 响应 => RedirectResult
  4. Request => ViewResult ==> 如果没有 KeepPeek 方法用于持久化数据,TempDataDictionary 内容可能会在此处丢弃
  5. 响应 => 查看(TempDataDictionary 为空)

因此,使用 TempDataDictionary 的正确方法是将值直接传递给当前请求中的视图,或者使用重定向到另一个控制器操作方法作为后续请求,例如:

控制器

public ActionResult ControllerToView()
{
    ...
    TempData["example"] = "this is a message!";
    ...
    // returning view counts as providing response
    return View();
}

查看

@if (myCondition)
{
    var test = TempData["example"]; // showing message
    <p>@test</p>
}

上面例子的请求顺序如下:

  1. 请求 => ActionResult (ControllerToView)
  2. 设置TempDataDictionary
  3. 响应=>查看(TempDataDictionary不为空)

如果您使用 RedirectResult 然后在 TempData 中尝试 read/display 值而不指定 'next action',它被视为 "normal read" 并且不会持续到下一个要求。您可以使用 'next action':KeepPeek(在视图或控制器操作中):

// Keep
var test = TempData["example"];
TempData.Keep("example");

// Peek
var test = TempData.Peek("example");

注意:如果您希望设置值在多个请求中保持不变,我强烈建议 HttpSessionState:

// set session state
Session["example"] = "[any value]";

// read in another request
var testing = Session["example"];

参考文献:

Using Tempdata in ASP.NET MVC - Best practice

When to use ViewBag, ViewData, or TempData