Asp.net ViewBag和ViewData之间的比较?

Asp.net ViewBag和ViewData之间的比较?,asp.net,asp.net-mvc,c#-4.0,Asp.net,Asp.net Mvc,C# 4.0,在ViewBag和ViewData中,在.net MVC中查看控制器中的数据哪个更好 ViewBag是一个围绕ViewData的动态包装器 因此,使用ViewData,您可以 ViewData[“MyData”]=“Hello World” 您可以使用 ViewBag.MyData=“Hello World” 由于ViewBag是动态的,因此您可以访问实际上可能不存在的属性,例如ViewBag。此处没有任何内容,代码仍将编译。当您运行该行代码时,它可能会遇到异常,但直到运行时才解析该属性 更多信

在ViewBag和ViewData中,在.net MVC中查看控制器中的数据哪个更好

ViewBag
是一个围绕
ViewData
的动态包装器

因此,使用ViewData,您可以

ViewData[“MyData”]=“Hello World”

您可以使用

ViewBag.MyData=“Hello World”

由于
ViewBag
动态的
,因此您可以访问实际上可能不存在的属性,例如
ViewBag。此处没有任何内容
,代码仍将编译。当您运行该行代码时,它可能会遇到异常,但直到运行时才解析该属性

更多信息可以在这里找到


查看数据和查看包对象都非常适合在控制器和视图之间访问数据

ViewBag
对象允许您向其添加
dynamic
属性,这使其成为一个非常灵活的工具。因此
dynamic
对象,这意味着您可以在控制器中向其添加属性。它实现了与
ViewData
相同的目标,应该避免使用强类型视图模型。

正如Jason提到的,“ViewBag是ViewData的动态包装器”

在大多数情况下,选择一种语法比另一种语法没有真正的技术优势。ViewBag只是一些人喜欢的语法糖,而不是字典语法。
尽管选择一种格式比另一种格式可能没有技术优势,这两种语法之间有一些关键的区别需要注意

一个明显的区别是,ViewBag仅在访问的密钥是有效的C#Identifier时才起作用。例如,如果在ViewData[“Key With Spaces”]中放置一个值,则无法使用ViewBag访问该值,因为代码不会编译

另一个需要注意的关键问题是,动态值不能作为参数传递给扩展方法。为了选择正确的扩展方法,C#编译器必须在编译时知道每个参数的实际类型

如果任何参数是动态的,编译将失败。例如,此代码将 总是失败:@Html.TextBox(“name”,ViewBag.name)。要解决此问题,请使用ViewData[“Name”]或将值强制转换为特定类型:(字符串)ViewBag.Name.