我在将数据传递到视图的Controller中具有以下类:
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
的任何值都将被丢弃,称为“正常读取”。
这样您的当前请求就包含以下序列:
请求=> ActionResult(ControllerToView)
设置TempDataDictionary
响应=> RedirectResult
如果没有用于保留数据的TempDataDictionary
或Keep
方法,则Request => ViewResult ==> 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>
}
上面示例的请求顺序如下:
请求=> ActionResult(ControllerToView)
设置
TempDataDictionary
响应=>视图(
TempDataDictionary
不为空)如果使用
RedirectResult
,然后尝试在不指定'next action'的情况下读取/显示TempData
中的值,则该值被视为“正常读取”,并且在下一个请求中未保留。您可以使用“下一个动作”: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"];
参考文献:
Using Tempdata in ASP.NET MVC - Best practice
When to use ViewBag, ViewData, or TempData