本文主要是介绍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 到底有什么区别?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!