【问题标题】:Null TempData when passing data from controller to view MVC将数据从控制器传递到查看 MVC 时为 Null TempData
【发布时间】:2017-07-27 16:33:53
【问题描述】:

我在控制器中有以下类将数据传递给视图:

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 请求,这可能是有用的信息。

【问题讨论】:

  • 您不是在返回视图,而是在重定向。重定向使用自己的 TempData 字典触发完全不同的控制器操作。
  • 那么不能这样传递 TempData 吗?关于我应该做什么的任何建议?
  • 看看这篇文章是否有帮助
  • 临时数据的生命周期只针对一个请求。换句话说,它存在于两个连续的请求之间。因此,如果您在两者之间有请求,它可能会被取消。

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


【解决方案1】:

您应该知道TempDataDictionary 用于短期实例。当下一个请求肯定重定向到下一个视图(适用于一次性消息)时,它的值在当前和后续请求期间可用。您分配给TempDataDictionary的任何值将在后续请求完成后丢弃,作为“正常读取”。

因此您当前的请求由以下序列组成:

  1. 请求 => ActionResult (ControllerToView)
  2. 设置TempDataDictionary
  3. 响应 => 重定向结果
  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 中的值而不指定“下一个操作”,则它被视为“正常读取”并且不会为下一个请求保留。您可以使用的“下一个操作”: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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    相关资源
    最近更新 更多