我在MVC 3中看到了ViewBag。这和MVC 2中的ViewData有什么不同?
当前回答
public ActionResult Index()
{
ViewBag.Name = "Monjurul Habib";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Monjurul Habib";
return View();
}
In View:
@ViewBag.Name
@ViewData["Name"]
其他回答
我能建议你不要用吗?
如果你想“发送”数据到你的屏幕上,发送一个强类型对象(又名ViewModel),因为它更容易测试。
如果你绑定到某种类型的“模型”,并拥有随机的“viewbag”或“viewdata”项,那么这会使自动化测试变得非常困难。
如果您正在使用这些,请考虑如何重构并仅使用ViewModels。
viewdata:是一个字典,用于存储视图和控制器之间的数据,你需要将视图数据对象转换为视图中相应的模型,以便能够从中检索数据…
ViewBag:是一个动态属性,在它的工作类似于视图数据,但它是更好的,因为它不需要在视图中使用它之前被强制转换为相应的模型…
所有的答案都表明ViewBag和/或ViewData是将数据从控制器传递到视图,这是错误的信息。两者都非常有用,可以将数据从视图传递到布局或局部视图(或ViewComponents等)。它不是控制器专属的。
默认的asp.net示例在布局页面中有:
<title>@ViewData["Title"] - MyApp</title>
在任何情况下
ViewData["Title"] = "Details";
然后,问这个问题:“ViewBag和ViewData之间有什么区别?”
最显著的区别是ViewData是一个强类型字典 ViewBag是一个动态类型。
注意里面的数据IS the SAME
ViewData["Title"] = "MyTitle";
ViewBag.Title; // returns "MyTitle";
什么时候用这个或那个?
ViewBag doesn't support not valid C# names. you can't access ViewData["Key With Space"] with ViewBag ViewBag.Something is dynamic and you may have problems when calling methods (like extension methods) that needs to know the exact parameter at compile time. ViewBag can check for nulls syntactical cleaner: ViewBag.Person?.Name ViewData have all the properties of a Dictionary like ContainsKey, Add, etc. so you can use ViewData.Add("somekey", "somevalue") keep in mind it might throw exceptions. Using ViewData on views needs TypeCasting while ViewBag don't.
知道了细微的差别,使用其中一种更像是一种口味偏好。
通常你可以想到ViewBag。ViewData别名的任意键["AnyKey"]
有一些细微的区别,这意味着你可以使用ViewData和ViewBag与视图略有不同的方式。这篇文章http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx中概述了一个优点,并展示了在示例中可以通过使用ViewBag而不是ViewData来避免强制转换。
ViewData:它需要对复杂的数据类型进行类型转换,并检查空值以避免错误。
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();
}
}
View的代码如下:
@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>
推荐文章
- 如何为构造函数定制Visual Studio的私有字段生成快捷方式?
- 为什么Visual Studio 2015/2017/2019测试运行器没有发现我的xUnit v2测试
- AppSettings从.config文件中获取值
- 如何检查IEnumerable是否为空或空?
- 没有ListBox。SelectionMode="None",是否有其他方法禁用列表框中的选择?
- 在c#代码中设置WPF文本框的背景颜色
- 如何在iis7应用程序池中设置。net Framework 4.5版本
- 如何分裂()一个分隔字符串到一个列表<字符串>
- 如何指定最小值,但没有使用范围数据注释属性的最大小数?
- 如何在PowerShell中获得本地主机名?
- 为什么在Java和。net中不能修改字符串?
- 'throw'和'throw new Exception()'的区别
- c# int到字节[]
- 如何跟踪log4net问题
- foreach vs somlist . foreach (){}