将数据从控制器传递到视图 MVC 时为 Null TempData
Null TempData when passing data from controller to view MVC
我在向视图传递数据的控制器中有以下 class:
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
的任何值都将在后续请求 完成后被丢弃,如 "normal read".
因此您当前的请求包含以下序列:
- 请求 => ActionResult (ControllerToView)
- 设置
TempDataDictionary
- 响应 => RedirectResult
- Request => ViewResult ==> 如果没有
Keep
或 Peek
方法用于持久化数据,TempDataDictionary
内容可能会在此处丢弃
- 响应 => 查看(
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
然后在 TempData
中尝试 read/display 值而不指定 'next action',它被视为 "normal read" 并且不会持续到下一个要求。您可以使用 'next action':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
我在向视图传递数据的控制器中有以下 class:
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
的任何值都将在后续请求 完成后被丢弃,如 "normal read".
因此您当前的请求包含以下序列:
- 请求 => ActionResult (ControllerToView)
- 设置
TempDataDictionary
- 响应 => RedirectResult
- Request => ViewResult ==> 如果没有
Keep
或Peek
方法用于持久化数据,TempDataDictionary
内容可能会在此处丢弃 - 响应 => 查看(
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
然后在 TempData
中尝试 read/display 值而不指定 'next action',它被视为 "normal read" 并且不会持续到下一个要求。您可以使用 'next action':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