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

时间:2017-07-27 16:33:53

标签: c# asp.net-mvc viewbag tempdata

我在Controller中将以下类传递给视图:

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

在我的视图中,我尝试使用以下命令访问TempData字典:

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

&#34; myCondition&#34;总是满意,但TempData字典总是空的。有什么想法吗?为了在视图中使TempData可用,我是否需要编写任何附加代码?

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

1 个答案:

答案 0 :(得分:3)

您应该知道TempDataDictionary用于短期实例。它的价值在当前和当下一个请求确实重定向到下一个视图(适用于一次性消息)时的后续请求。您已分配给TempDataDictionary 的任何值将在完成后续请求后被丢弃,因为&#34;正常阅读&#34;。

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

  1. 请求=&gt; ActionResult(ControllerToView)
  2. 设置TempDataDictionary
  3. 响应=&gt; RedirectResult
  4. 请求=&gt; ViewResult ==&gt;如果没有用于保留数据的TempDataDictionaryKeep方法,Peek内容可能会被丢弃
  5. 响应=&gt;视图(TempDataDictionary为空)
  6. 因此,使用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. 请求=&gt; ActionResult(ControllerToView)
    2. 设置TempDataDictionary
    3. 响应=&gt;查看(TempDataDictionary不为空)
    4. 如果您使用RedirectResult然后尝试在TempData中读取/显示值而未指定“下一步操作”,则会将其视为&#34;正常读取&#34; &安培;没有坚持下次请求。 &#39;下一步行动&#39;您可以使用: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