十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
ViewBag, ViewData十分类似,都可用于把数据从controller传递到view。
成都创新互联是一家集网站建设,安庆企业网站建设,安庆品牌网站建设,网站定制,安庆网站建设报价,网络营销,网络优化,安庆网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
ViewBag是WebViewPage中的一个属性,它的类型是dynamic。dynamic类型可以理解为,编译器在编译到这种类型时,会跳过类型检查,而在运行时做这些事情。
ViewData也是WebViewPage类中的一个属性,但他的类型是ViewDataDictionary。从内部实现上,ViewBag属性是按照键值对那样存放在ViewData中的,因此也可以通过方为ViewData中值来访问ViewBag的值,他们指向的引用是同一个的。但是区别在于,ViewData的写法是按照序列访问那样,通过索引访问,而ViewBag是通过属性访问。事实上,在编译阶段,编译器无法知道ViewBag所给的属性是否存在,这都是在运行时决定的。举个例子,ViewData["Index"]可以写成:ViewBag.Foo,而不需要担心编译时错误。
我们可以通过下面的例子来验证ViewBag和ViewData其实指向的对象是同一个。
@{
ViewBag.XXX = new StringBuilder("222");
ViewData["XXX"] = new StringBuilder("333");
}
ViewBag的类型是 @ViewBag.GetType();
ViewData的类型是 @ViewData.GetType();
ViewBag.XXX 的值是 @ViewBag.XXX
ViewData["XXX"]的值是 @ViewData["XXX"]
@(ViewBag.XXX == ViewData["XXX"])
@(ViewBag.XXX.Equals(ViewData["XXX"]))
@ViewBag.XXX.GetHashCode()
@ViewData["XXX"].GetHashCode()
得到的结果如下:
可以看到对ViewData["XXX"]做更改,会影响到ViewData.XXX。后续的例子有证明了他们是指向同一个引用的。
在使用ViewBag的时候,有一个好处就是不需要做类型转换。因为是dynamic类型,只要保证在运行时的类型正确既可以了。举个例子:
@{
ViewBag.XXX = new List
ViewData["YYY"] = new List
foreach (var i in ViewBag.XXX)
{
@i
}
foreach (var i in ViewData["YYY"] as List
{
@i
}
}
无论是ViewBag还是ViewData,都仅仅对当前的请求有效,他们的生命周期很短,无法存在于多个请求中。
TempData的出现可以存在多个请求,但是,也被限制于当前请求和下一次请求(通常是Redirect)。它的内部实现是使用了Session。
public void Index(){
TempData["text"] = "123456";
RedirectToAction( "Test1" );
//RenderView("Index");
}
public void Test1(){
string text = TempData["text"] as string;
RenderView("Test1");
}
public void Test2(){
string text = TempData["text"] as string;
RenderView("Test2");
}
如上面的例子,Index中的TempData可以在跳转到Test1的时候获得,但不能在Test2中获得。