【问题标题】:Asp.Net mvc 5 tempdata doesn't workAsp.Net mvc 5 临时数据不起作用
【发布时间】:2017-08-21 09:57:09
【问题描述】:

我正在用书中的代码学习 ASP.net MVC5。

public ActionResult DemoTempData()
{
    ViewData["Msg1"] = "From ViewData Message.";
    ViewBag.Msg2 = "From ViewBag Message.";
    TempData["Msg3"] = "From TempData Message.";
    return RedirectToAction("Redirect1");
}

public ActionResult Redirect1()
{
    TempData["Msg4"] = TempData["Msg3"];
    return RedirectToAction("GetRedirectData");
}

public ActionResult GetRedirectData()
{
    return View();
}

GetRedirectData查看:

@{
    ViewBag.Title = "GetRedirectData";
}

<h2>GetRedirectData</h2>
<ul>
    <li>ViewData-Msg1:@ViewData["Msg1"]</li>
    <li>ViewBag-Msg2:@ViewBag.Msg2</li>
    <li>TempData-Msg3:@TempData["Msg3"]</li>
    <li>TempData-Msg4:@TempData["Msg4"]</li>
</ul>

我知道ViewData 和ViewBag 不会传递值。 视图中的Msg3 和Msg4 应该具有价值,但它没有。 我检查Redirect1()中的值,原来Msg3是null。
我对发生的事情感到非常困惑。

【问题讨论】:

  • @TempData["Msg3"] 在视图中不会有值(TempData 只持续一个请求)。但是@TempData["Msg4"] 应该有一个值——你是说那也是null?

标签: asp.net-mvc asp.net-mvc-5 tempdata


【解决方案1】:

ASP.NET MVC TempData 将其内容存储在 Session 状态。所以 TempData 在后续 HTTP 请求中使用后会立即销毁。

在您的情况下,您将 TempData["Msg3"] 分配给 TempData["Msg4"]。因此,一旦您使用 TempData["Msg3"] 中的内容,它就会被销毁。因此,每当您尝试访问 TempData["Msg3"] 时,您都会得到空值。

Peek 和 Keep 方法允许您读取值而不会被破坏。

参考:

https://msdn.microsoft.com/enus/library/system.web.mvc.tempdatadictionary.peek(v=vs.118).aspx

object value = TempData["value"];

TempData.Keep("value");

object value = TempData["value"];

【讨论】:

    【解决方案2】:

    在控制器中使用内置的 Session 管道,它会一直存在,直到您销毁它。我喜欢它,因为它总是有效,而且很容易。它可以在

    System.Web.HttpContext
    

    这确实是当前请求

    节省使用(示例)

    System.Web.HttpContext.Current.Session["Msg3"] =  StringOfIds;
    

    要检索...

    string msg3= (string) System.Web.HttpContext.Current.Session["Msg3"]; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      • 2023-03-08
      • 2017-11-08
      • 2018-06-18
      相关资源
      最近更新 更多