我在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请求。
答案 0 :(得分:3)
您应该知道TempDataDictionary
用于短期实例。它的价值在当前和当下一个请求确实重定向到下一个视图(适用于一次性消息)时的后续请求。您已分配给TempDataDictionary
的任何值将在完成后续请求后被丢弃,因为&#34;正常阅读&#34;。
因此,您当前的请求包含以下序列:
TempDataDictionary
TempDataDictionary
或Keep
方法,Peek
内容可能会被丢弃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>
}
以上示例的请求序列如下:
TempDataDictionary
TempDataDictionary
不为空)如果您使用RedirectResult
然后尝试在TempData
中读取/显示值而未指定“下一步操作”,则会将其视为&#34;正常读取&#34; &安培;没有坚持下次请求。 &#39;下一步行动&#39;您可以使用:Keep
或Peek
(在视图或控制器操作中):
// 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"];
参考文献: