我在MVC 3中看到了ViewBag。这和MVC 2中的ViewData有什么不同?
当前回答
在ViewBag内部,属性以名称/值对的形式存储在ViewData字典中。
注意:在MVC 3的大多数预发布版本中,ViewBag属性被命名为ViewModel,这段代码来自MVC 3发布说明:
有人建议我发布我发布的这个信息的来源,下面是来源: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4
MVC 2 controllers support a ViewData property that enables you to pass data to a view template using a late-bound dictionary API. In MVC 3, you can also use somewhat simpler syntax with the ViewBag property to accomplish the same purpose. For example, instead of writing ViewData["Message"]="text", you can write ViewBag.Message="text". You do not need to define any strongly-typed classes to use the ViewBag property. Because it is a dynamic property, you can instead just get or set properties and it will resolve them dynamically at run time. Internally, ViewBag properties are stored as name/value pairs in the ViewData dictionary. (Note: in most pre-release versions of MVC 3, the ViewBag property was named the ViewModel property.)
其他回答
在ViewBag内部,属性以名称/值对的形式存储在ViewData字典中。
注意:在MVC 3的大多数预发布版本中,ViewBag属性被命名为ViewModel,这段代码来自MVC 3发布说明:
有人建议我发布我发布的这个信息的来源,下面是来源: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4
MVC 2 controllers support a ViewData property that enables you to pass data to a view template using a late-bound dictionary API. In MVC 3, you can also use somewhat simpler syntax with the ViewBag property to accomplish the same purpose. For example, instead of writing ViewData["Message"]="text", you can write ViewBag.Message="text". You do not need to define any strongly-typed classes to use the ViewBag property. Because it is a dynamic property, you can instead just get or set properties and it will resolve them dynamically at run time. Internally, ViewBag properties are stored as name/value pairs in the ViewData dictionary. (Note: in most pre-release versions of MVC 3, the ViewBag property was named the ViewModel property.)
public ActionResult Index()
{
ViewBag.Name = "Monjurul Habib";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Monjurul Habib";
return View();
}
In View:
@ViewBag.Name
@ViewData["Name"]
ViewBag和ViewData是ASP中用来将信息从控制器传递到视图的两种方式。净MVC。使用这两种机制的目的是提供控制器和视图之间的通信。两者的生命周期都很短,即一旦重定向发生,两者的值都将变为null,即一旦页面从源页面(我们在其中设置了ViewBag或ViewData的值)重定向到目标页面,ViewBag和ViewData都将变为null。
尽管ViewBag和ViewData有这些相似之处,但如果我们讨论它们的实现,它们是两个不同的东西。区别如下:
1)。如果我们分析这两个实现,我们会发现ViewData是一个字典数据结构——对象字典从viewdatdictionary派生而来,可以使用字符串作为这些值的键来访问,而ViewBag利用了c# 4.0中引入的动态特性,并且是一个动态属性。
2)。当从ViewData中访问值时,我们需要类型转换值(数据类型),因为它们存储为ViewData字典中的对象,但如果我们在ViewBag中访问值,则不需要这样做。
3)。在ViewBag中,我们可以像这样设置值:
ViewBag.Name = "Value";
并可访问如下:
@ViewBag.Name
而在ViewData的情况下,值可以设置和访问如下: 设置ViewData的方法如下:
ViewData["Name"] = "Value";
像这样获取价值
@ViewData["Name"]
详情请按此处:
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>
ViewBag
它返回Type Object。 它是ControllerBase类的一个动态属性。 ViewBag仅适用于。net Framework 4.0及以上版本。 因为ViewBag属性本质上是动态的,所以在使用前不需要进行类型转换。 ViewBag返回动态类型对象,它的属性也是动态的。 它比ViewData快一点。
显示数据
它返回键值字典对集合。 ViewData是一个字典对象,它是ControllerBase类的属性。 ViewData比ViewBag快。 类型转换代码在枚举时是必需的,因为它是字典对集合。 ViewData返回对象(键值对的类型和值是类型对象,所以在使用前需要转换)
public ActionResult Index()
{
ViewBag.Name = "";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Arun Prakash";
return View();
}
视图呼叫
@ViewBag.Name
@ViewData["Name"]