ViewData和ViewBag有什么区别?

我在MVC 3中看到了ViewBag 。与MVC 2中的ViewData有什么不同?

它使用C#4.0dynamicfunction。 它实现了与viewdata相同的目标,应该避免使用强types视图模型(应避免使用viewdata)。

所以基本上它取代了魔术string

 ViewData["Foo"] 

具有魔法属性

 ViewBag.Foo 

为此你没有编译时间的安全性。

我继续责怪微软不断在MVC中引入这个概念。

属性的名称区分大小写。

内部ViewBag属性作为名称/值对存储在ViewData字典中

注意:在MVC 3的大多数预发布版本中,ViewBag属性被命名为ViewModel,如MVC 3发行说明的片段中所述:

(编辑10-8-12)有人build议我发布这个信息的来源,我发布,这里是来源: http : //www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4

MVC 2控制器支持ViewData属性,该属性使您可以使用后期绑定的字典API将数据传递到视图模板。 在MVC 3中,您也可以使用ViewBag属性的简单语法来实现相同的目的。 例如,不用编写ViewData [“Message”] =“text”,你可以编写ViewBag.Message =“text”。 您不需要定义任何强types的类来使用ViewBag属性。 因为它是一个dynamic属性,所以可以取而代之的是获取或设置属性,并在运行时dynamicparsing它们。 在内部,ViewBag属性作为名称/值对存储在ViewData字典中。 (注意:在大多数预发布版本的MVC 3中,ViewBag属性被命名为ViewModel属性。)

ViewBag与MVC中的ViewData

http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html

ViewBag&ViewData之间的相似之处:

帮助您从控制器移动到查看时保持数据。 用于将数据从控制器传递到相应的视图。 寿命短意味着redirect时值变为空。 这是因为他们的目标是提供一种在控制器和视图之间进行通信的方式。 这是服务器调用中的通信机制。

ViewBag&ViewData之间的区别:

ViewData是从ViewDataDictionary类派生并可以使用string作为键访问的对象的字典。 ViewBag是一个dynamic属性,它利用了C#4.0中的新dynamic特性。 ViewData需要对复杂数据types进行types转换,并检查空值以避免错误。 ViewBag不需要对复杂的数据types进行types转换。

ViewBag&ViewData示例:

 public ActionResult Index() { ViewBag.Name = "Arun Prakash"; return View(); } public ActionResult Index() { ViewData["Name"] = "Arun Prakash"; return View(); } 

在视图中调用

 @ViewBag.Name @ViewData["Name"] 

ViewData :对于复杂的数据types,需要进行types转换,并检查空值以避免错误。

ViewBag :它不需要复杂数据types的types转换。

考虑下面的例子:

 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.emp.Name</h4> <h3>@viewDataEmployee.Name</h3> 

所有的答案都build议ViewBag和/或ViewData将数据从Controller传递给Views ,这是错误的信息。 两者都是非常有用的数据从视图传递到布局或部分视图(或ViewComponents等)它不是控制器的独占。

作为默认的asp.net样本在布局页面中有这个:

 <title>@ViewData["Title"] - MyApp</title> 

并以任何观点

 ViewData["Title"] = "Details"; 

那么,问一个问题:“ ViewBagViewData什么区别?”

最显着的区别是ViewData是一个强types字典,而ViewBag是一个dynamictypes。

请注意,里面的数据是相同的

 ViewData["Title"] = "MyTitle"; ViewBag.Title; // returns "MyTitle"; 

何时使用这个或另一个?

  • ViewBag不支持无效的C#名称。 您无法使用ViewBag访问ViewData["Key With Space"]
  • ViewBag.Something是dynamic的,当调用在编译时需要知道确切参数的方法(如扩展方法)时,可能会遇到问题。
  • ViewBag可以检查空值语法清理器: ViewBag.Person?.Name
  • ViewData具有像ContainsKeyAdd等词典的所有属性,所以你可以使用ViewData.Add("somekey", "somevalue")记住它可能会抛出exception。
  • 在View上使用ViewData需要TypeCasting,而ViewBag则不需要。

了解微妙的差异,使用这个或那个更是一种口味偏好。

通常您可以将ViewBag.AnyKey ViewData["AnyKey"]一个别名ViewData["AnyKey"]

我可以推荐给你不要使用吗?

如果你想“发送”数据到你的屏幕,发送强types的对象(AKA ViewModel),因为它更容易testing。

如果绑定到某种“模型”,并有随机的“viewbag”或“viewdata”项目,那么它使自动化testing非常困难。

如果你正在使用这些考虑如何你可能能够重组,并只使用ViewModels。

有一些微妙的差异,这意味着你可以以不同的方式使用ViewData和ViewBag。 在这个post中概述了一个优点http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx,并显示了铸造在示例中可以通过使用ViewBag而不是ViewData来避免。;

viewdata:是一个字典用于存储数据之间的视图和控制器,你需要将视图数据对象转换为其相应的模型在视图中,以便能够从它检索数据…

ViewBag:是一个dynamic属性,它的工作与视图数据类似,但是它更好,因为它不需要在视图中使用它之前被转换到它的corressponding模型。

 public ActionResult Index() { ViewBag.Name = "Monjurul Habib"; return View(); } public ActionResult Index() { ViewData["Name"] = "Monjurul Habib"; return View(); } In View: @ViewBag.Name @ViewData["Name"] 

通过这种方式,我们可以使用这个值来将控制器之间的信息传递给TEMP DATA的其他页面

虽然在select一种格式时可能没有技术上的优势,但应该注意两种语法之间的一些重要区别。 一个明显的区别是ViewBag只有在你正在访问的密钥是一个有效的C#标识符时才能工作。 例如,如果您在ViewData [“Key With Spaces”]中放置一个值,则无法使用ViewBag访问该值,因为代码将无法编译。 要考虑的另一个关键问题是,您不能将dynamic值作为parameter passing给扩展方法。 C#编译器在编译时必须知道每个参数的实际types,才能select正确的扩展方法。 如果任何参数是dynamic的,编译将失败。 例如,这段代码总是失败:@ Html.TextBox(“name”,ViewBag.Name)。 要解决这个问题,可以使用ViewData [“Name”]或者转换va

我注意到ViewData和ViewBag之间的一个主要区别是:

ViewData:它将返回对象并不重要,你已经分配到这个,并需要重新types转换回原来的types。

ViewBag:返回精确的types是足够聪明的,你分配给它的天气你已经分配了简单types(即int,string等)或复杂types并不重要。

例如:控制器代码。

  namespace WebApplication1.Controllers { public class HomeController : Controller { public ActionResult Index() { Products p1 = new Products(); p1.productId = 101; p1.productName = "Phone"; Products p2 = new Products(); p2.productId = 102; p2.productName = "laptop"; List<Products> products = new List<Products>(); products.Add(p1); products.Add(p2); ViewBag.Countries = products; return View(); } } public class Products { public int productId { get; set; } public string productName { get; set; } } } 

查看代码。

 <ul> @foreach (WebApplication1.Controllers.Products item in ViewBag.Countries) { <li>@item.productId &nbsp;&nbsp;&nbsp;@item.productName</li> } </ul> 

输出屏幕。

在这里输入图像描述

查看数据

  1. ViewData用于将数据从控制器传递到视图
  2. ViewData派生自ViewDataDictionary类,基本上是一个Dictionary对象,即Keys和Values,其中Keys是String,而Values则是对象。
  3. 数据types转换是从ViewData中检索数据时所必需的,因为它的Objecttypes的数据也是空的,所以需要对types转换进行vvalue检查,否则会中断应用程序。 如果发生redirect,则其值变为空。读取TempData ViewData和View Bag之间的完全区别

http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html

ViewBag和ViewData是用来将信息从控制器传递到ASP.Net MVC中查看的两​​种方法。 使用这两种机制的目的是提供控制器和视图之间的沟通。 两者的寿命都很短,一旦redirect发生,两者的值都变为null,即一旦页面从源页面(我们将ViewBag或ViewData的值设置到目标页面)redirect到目标页面,ViewBag和ViewData变为空。

尽pipe有这些相似之处(ViewBag和ViewData)是两个不同的东西,如果我们谈论两者的实现。 差异如下:

1.)如果我们分析两个实现明智的话,我们会发现ViewData是一个字典数据结构 – 从ViewDataDictionary派生的对象字典,可以使用string作为这些值的键,而ViewBag利用C#4.0中引入的dynamic特性和是一个dynamic属性。

2.)当访问ViewData的值时,我们需要在ViewData字典中存储对象types的值(数据types),但是如果在ViewBag中访问值,则不需要这样的值。

3.)在ViewBag中,我们可以像这样设置值:

  ViewBag.Name = "Value"; 

并可以访问如下:

  @ViewBag.Name 

在ViewData的情况下,可以如下设置和访问值:设置ViewData如下:

 ViewData["Name"] = "Value"; 

并像这样访问价值

  @ViewData["Name"] 

欲了解更多详情请点击这里