咨询区
- user469652 
请问 ASP.NET MVC 中的 ViewBag 和 ViewData 到底哪一个好,在实际项目开发中应该选择哪一个?
回答区
- Naresh Ravlani 
- ViewData 
它需要对复杂类型进行类型转换并且还要检查null值来防止错误。
- ViewBag 
它不需要对 复杂类型 进行类型转换。
考虑下面的代码:
public class HomeController : Controller
{public ActionResult Index(){var emp = new Employee{EmpID=101,Name = "Deepak",Salary = 35000,Address = "Delhi"};ViewData["emp"] = emp;ViewBag.Employee = emp;return View(); }
}对应的 HomeView 代码如下:
@model MyProject.Models.EmpModel;
@{ Layout = "~/Views/Shared/_Layout.cshtml"; ViewBag.Title = "Welcome to Home Page";var viewDataEmployee = ViewData["emp"] as Employee; //need type casting
}<h2>Welcome to Home Page</h2>
This Year Best Employee is!
<h4>@ViewBag.Employee.Name</h4>
<h3>@viewDataEmployee.Name</h3>- Bart Calixto 
我看过很多的资料说, ViewBag 或 ViewData 用途都是将数据从 Controller 传送到 Views 中,我觉得这种说法比较偏驳,甚至是错的,我这么说的原因是,它不仅可以实现 Controller 到 View, 还可以实现 View 到 Layout 或者 View 到 Partial 中。
下面是一个 layout 页。
<title>@ViewData["Title"] - MyApp</title>然后是一些 view 页。
ViewData["Title"] = "Details";接下来我再回答下 ViewBag 和 ViewData 到底有什么不同,最明显的不同是 ViewData 它的内部是一个强类型的字典结构,而 ViewBag 是一个动态类型。
接下来的问题是它们各有什么应用场景呢?
- ViewBag 不支持错误的C#命名规范,比如说 - Key With Space就无法用 ViewBag。
- ViewBag.Something 是动态类型,所以你需要明确知道它到底是什么类型,而且在运行时也可能会报错。 
- ViewData 需要类型转换,而 ViewBag 不会。 
知道这些微妙的不同,接下来就可以按照你的爱好使用啦。
点评区
在这种判断异同的场景,我个人建议多使用 ILSpy 或者 DnSpy 去翻看里面的源代码,这样才能做到心中有数。