ViewData 和 ViewBag 到底有什么区别?
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ViewData 和 ViewBag 到底有什么区别?相关的知识,希望对你有一定的参考价值。
咨询区
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
去翻看里面的源代码,这样才能做到心中有数。
以上是关于ViewData 和 ViewBag 到底有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章
NET MVC中ViewData,ViewBag和TempData的区别浅析
简述viewdata,viewbag和tempdata的区别