ViewBag和TempData的区别
ViewData | ViewBag |
它是Key/Value字典集合 | 它是dynamic类型对像 |
从Asp.net MVC 1 就有了 | ASP.NET MVC3 才有 |
基于Asp.net 3.5 framework | 基于Asp.net 4.0与.net framework |
ViewData比ViewBag快 | ViewBag比ViewData慢 |
在ViewPage中查询数据时需要转换合适的类型 | 在ViewPage中查询数据时不需要类型转换 |
有一些类型转换代码 | 可读性更好 |
在控制器(Controller)中使用
ViewData:
Controller里取数据赋值
var markeType = new MarketDataProvider().GetBTIDData().Where(a=>a.ID!="0"); //在数据库获取数据,这是list数据 ViewBag.DateType = markeType;//给ViewBag.DateType 赋值 “DateType ”可以随便写名称。
* 前台调用
@foreach (var modelMarket in ViewData["Markettype"] as Dictionary<string, string>)
{
<div class="row" style="margin-top:10px">
<div class="col-md-4 text-right"><span class="red">*</span> @modelMarket.Value</div>
</div>
}
ViewBag :
Controller里取数据赋值
string str = "商标,版权,交易,国际注册";
string[] strs = str.Split(',');
Dictionary<string, string> dic = new Dictionary<string, string>();
for(int i=0;i<5;i++)
{
dic.Add(i.ToString(),strs[i]);
}
ViewData["Markettype"] = dic;
前台调用:
@foreach (var modelMarket2 in ViewBag.DateType)
{
<div class="row" style="margin-top:10px">
<div class="col-md-4 text-right"><span class="red">*</span> @modelMarket2.Text</div>
</div>
}
按F12运行网站便可以看到运行结果,两个也可以用于不分页的新闻列表。
TempData
TempData也是字典,所以它的使用完全等同于ViewData,但两者之间还是存在很大的差异。
TempData,顾名思义,就是临时数据。TempData保存在Session中,Controller每次请求的时候都会从Session中获取TempData,然后清除Session。基于这样的事实,在每次请求结束后,TempData的生命周期也就结束了。网上有一句话:TempData至多之只能通过一次Controller传递,假设我们的Controller是跳转到下一个Controller,以此类推,在最后一个Controlle相应的视图上,的确可以获得该TempData。但是,这并不是说TempData已经跨请求传递了,这依然只是一次请求,至于是否是跨Controller传递,我认为不是,所谓的通过Controller传递,是指将TempData传递给View,在上面的例子中,只有最后的Controller才会将该TempData传递给View,所以,TempData的确是只能通过一次Controller传递。
注:有的文字内容搜自博客园。