我知道ViewData是什么并且一直使用它,但是在ASP.NET Preview 5中他们引入了一些名为TempData的新东西。
我通常强烈键入我的ViewData,而不是使用对象字典方法。
那么,我何时应该使用TempData而不是ViewData?
对此有什么最佳做法吗?
答案 0 :(得分:91)
在一句话中:TempData
与ViewData类似,但有一点不同:它们只包含两个连续请求之间的数据,之后它们被销毁。您可以使用TempData
传递错误消息或类似内容。
虽然已过时,this article对TempData
生命周期有很好的描述。
正如Ben Scheirman所说here:
TempData是一个会话支持的临时存储字典,可用于单个请求。在控制器之间传递消息非常棒。
答案 1 :(得分:29)
当操作返回RedirectToAction结果时,会导致HTTP重定向(相当于Response.Redirect)。在单个HTTP重定向请求期间,数据可以保留在控制器的TempData属性(字典)中。
答案 2 :(得分:5)
<强>的ViewData:强>
ViewData
是字典类型public ViewDataDictionary ViewData { get; set; }
ControllerBase
上的一个属性,它是Controller
类TempData:
TempData
在内部使用TempDataDictionary
:public TempDataDictionary TempData { get; set; }
TempDataDictionary
对象后:
此行为是ASP.NET MVC 2及后续版本的新增功能。
在早期版本的ASP.NET MVC中,TempData
中的值仅在下一个请求之前可用。
See the comparison of ViewData, ViewBag, TempData and Session in MVC in detail
答案 3 :(得分:4)
我发现这种比较很有用:http://www.dotnet-tricks.com/Tutorial/mvc/9KHW190712-ViewData-vs-ViewBag-vs-TempData-vs-Session.html
我遇到的一个问题是TempData值在默认读取后被清除。有选项,see methods 'Peek' and 'Keep' on Msdn for more info。
答案 4 :(得分:0)
视图数据用于当我们要将数据从控制器传递到相应的视图时。 查看数据的寿命很短,这意味着重定向发生时它将破坏。 示例(控制器):
public ViewResult try1()
{
ViewData["DateTime"] = DateTime.Now;
ViewData["Name"] = "Mehta Hitanshi";
ViewData["Twitter"] = "@hitanshi";
ViewData["City"] = "surat";
return View();
}
try1.cshtm
<table>
<tr>
<th>Name</th>
<th>Twitter</th>
<th>Email</th>
<th>City</th>
<th>Mobile</th>
</tr>
<tr>
<td>@ViewData["Name"]</td>
<td>@ViewData["Twitter"]</td>
<td>@ViewData["City"]</td>
</tr>
</table>
TempData在控制器之间或动作之间传输数据。 它用于存储一次消息,并且寿命很短。我们可以使用TempData.Keep()通过所有操作使它可用或使其持久化。
示例(控制器):
public ActionResult try3()
{
TempData["DateTime"] = DateTime.Now;
TempData["Name"] = "Ravina";
TempData["Twitter"] = "@silentRavina";
TempData["Email"] = "Ravina12@gmail.com";
TempData["City"] = "India";
TempData["MobNo"] = 9998975436;
return RedirectToAction("TempView1");
}
public ActionResult TempView1()
{
return View();
}
TempView1.cshtm
<table>
<tr>
<th>Name</th>
<th>Twitter</th>
<th>Email</th>
<th>City</th>
<th>Mobile</th>
</tr>
<tr>
<td>@TempData["Name"]</td>
<td>@TempData["Twitter"]</td>
<td>@TempData["Email"]</td>
<td>@TempData["City"]</td>
<td>@TempData["MobNo"]</td>
</tr>
</table>
答案 5 :(得分:0)
只是TempData的附带说明。
直到下一个请求才存储其中的数据,直到下一个读取操作被调用!
参见:
TempData won't destroy after second request