ViewData和ViewBag之间的区别是什么?

我在MVC 3中看到ViewBag。这与MVC 2中的ViewData有何不同?

224127 次浏览

它使用c# 4.0动态特性。它实现了与viewdata相同的目标,应该避免使用强类型视图模型(与viewdata应该避免的方式相同)。

所以基本上它取代了神奇的字符串:

ViewData["Foo"]

魔法属性:

ViewBag.Foo

你没有编译时安全性。

我继续指责微软在MVC中引入了这个概念。

属性的名称区分大小写。

有一些细微的区别,这意味着你可以使用ViewData和ViewBag与视图略有不同的方式。这篇文章http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx中概述了一个优点,并表明在示例中可以通过使用ViewBag而不是ViewData来避免强制转换。

在内部,ViewBag属性以名称/值对的形式存储在显示数据字典中。

注意:在MVC 3的大多数预发布版本中,ViewBag属性被命名为ViewModel,这段代码来自MVC 3发布说明:

有人建议我发布我发布的这个信息的来源,这里是来源: http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4 < / p >
MVC 2控制器支持ViewData 属性,该属性使您能够传递数据 到使用后期绑定的视图模板 字典的API。在MVC 3中,你也可以 类使用稍微简单的语法 属性来完成 同样的目的。例如,而不是 写作视讯系统(“信息”)=“文本”, 你可以写ViewBag.Message="text"。 不需要定义 类的强类型类 ViewBag财产。因为它是 动态属性,你可以 获取或设置属性,它就会 在运行时动态解析它们。 在内部,ViewBag属性为 存储为名称/值对的 显示数据字典。(注:在大多数 MVC 3的预发布版本 ViewBag属性被命名为 ViewModel属性。)< / p >

我能建议你不要用吗?

如果你想“发送”数据到你的屏幕上,发送一个强类型对象(又名ViewModel),因为它更容易测试。

如果你绑定到某种类型的“模型”,并拥有随机的“viewbag”或“viewdata”项,那么这会使自动化测试变得非常困难。

如果您正在使用这些,请考虑如何重构并仅使用ViewModels。

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 vs MVC中的ViewData

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

ViewBag &显示数据:

从控制器移动到视图时帮助维护数据。用于 将数据从控制器传递到相应的视图。短寿命意味着 值在重定向发生时变为空。这是因为他们的目标 是提供一种在控制器和视图之间通信的方法。这是 服务器调用中的通信机制

ViewBag和amp的区别;显示数据:

ViewData是派生的对象字典 viewdatdictionary类,并使用字符串作为键访问。ViewBag 动态属性是否利用了新的动态特性 在c# 4.0。ViewData需要对复杂的数据类型进行类型转换 检查空值以避免错误。ViewBag不需要 复杂数据类型的类型转换

ViewBag,显示数据的例子:

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


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

视图呼叫

@ViewBag.Name
@ViewData["Name"]

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

ViewBag:是一个动态属性,它的工作类似于视图数据,但它更好,因为它不需要在视图中使用它之前被强制转换为相应的模型…

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"]

更多详细信息请点击这里:

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

所有答案都表明ViewBag和/或ViewData是将数据从Controller传递到Views,这是错误的信息。两者都非常有用,可以将数据从视图传递到布局或局部视图(或ViewComponents等)。它不是控制器专属的。

默认的asp.net示例在布局页面中有:

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

在任何情况下

ViewData["Title"] = "Details";

然后,问这个问题:“ViewBagViewData之间有什么区别?”

最显著的区别是ViewData是一个强类型字典,而 ViewBag是一个动态类型。< / p >

注意中的数据是相同的 < / >强

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

什么时候用这个或那个?

  • ViewBag不支持无效的c#名称。 你不能通过ViewBag
  • 访问ViewData["Key With Space"]
  • ViewBag.Something是动态的,在调用需要在编译时知道确切参数的方法(如扩展方法)时可能会遇到问题。
  • ViewBag可以检查空语法清理器
  • ViewData具有字典的所有属性,如ContainsKeyAdd等,所以你可以使用ViewData.Add("somekey", "somevalue"),记住它可能会抛出异常。
  • 在视图上使用ViewData需要类型转换,而ViewBag不需要。

知道了细微的差别,使用其中一种更像是一种口味偏好。

通常你可以把ViewBag.AnyKey想象成ViewData["AnyKey"]的别名

虽然你可能没有选择一种格式的技术优势 另一方面,你应该意识到两者之间的一些重要区别 语法。 一个明显的区别是ViewBag只在你正在访问的键时工作 是一个有效的c#标识符。例如,如果你在ViewData["Key . Key . "中放置一个值 对于空格"],你不能使用ViewBag访问该值,因为代码 不会编译。 另一个需要考虑的关键问题是不能将动态值作为参数传入 扩展方法。c#编译器必须知道每个对象的真实类型 参数,以便选择正确的扩展方法。 如果任何参数是动态的,编译将失败。例如,这段代码将会 总是失败:@Html。文本框(“名字”,ViewBag.Name)。也要解决这个问题 使用ViewData["Name"]或强制转换va

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

ViewData:它将返回object,不管你给它赋了什么,需要再次类型转换回原始类型。

ViewBag:它足够聪明,可以返回你分配给它的确切类型,不管你分配的是简单类型(即int,字符串等)还是复杂类型。

例如:控制器代码。

 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>

屏幕输出。

enter image description here

显示数据
  1. ViewData用于将数据从控制器传递到视图
  2. 它派生自viewdatdictionary类
  3. 它仅对当前请求可用
  4. 需要对复杂的数据类型进行类型转换,并检查空值以避免错误
  5. 如果发生重定向,则其值为null
ViewBag
  1. ViewBag还用于将数据从控制器传递到相应的视图
  2. ViewBag是一个动态属性,它利用了c# 4.0中的新动态特性
  3. 它也仅对当前请求可用
  4. 如果发生重定向,则其值为null
  5. 对于复杂的数据类型不需要类型转换

这里显示数据ViewBag都用于将数据从控制器传递到视图

1. 显示数据

——ViewData是字典对象,派生自ViewDataDictonary类。

数据只允许一个请求,当页面重定向发生时ViewData值被清除。

——ViewData值必须在使用前输入。

例子:在控制器中

public ActionResult PassingDatatoViewWithViewData()
{
ViewData["Message"] = "This message shown in view with the ViewData";
return View();
}

在视图

@ViewData["Message"];

——ViewData是像关键价值这样的一对,Message是Key,在倒逗号中value是value。

数据是简单的,所以我们不能在这里使用类型转换,如果数据是复杂的,那么使用类型转换。

public ActionResult PassingDatatoViewWithViewData()
{
var type= new List<string>
{
"MVC",
"MVP",
"MVVC"
};
ViewData["types"] = type;
return View();
}

在视图中数据可以提取为

<ul>
@foreach (var items in (List<string>)ViewData["types"])
{
<li>@items</li>
}
</ul>

2. ViewBag

——ViewBag使用动态特性。ViewBag包装了ViewData。

—在ViewBag类型铸造是必需的。

——与ViewData相同,如果重定向发生,值将变为null。

例子:

public ActionResult PassingDatatoViewWithViewBag()
{
ViewData.Message = "This message shown in view with the ViewBag";
return View();
}

在视图

@ViewBag.vbMessage

—对于复杂类型使用ViewBag

public ActionResult PassingDatatoViewWithViewBag()
{
var type= new List<string>
{
"MVC",
"MVP",
"MVVC"
};
ViewBag.types = type;
return View();
}

在视图中数据可以提取为

<ul>
@foreach (var items in ViewBag.types)
{
<li>@items</li>
}
</ul>

——主要的区别是ViewBag不需要类型转换,而显示数据是需要类型转换。

下面是关于ViewData, ViewBag, TempData &的点对点差异;会话。 信贷/复制askforprogram.in,遵循我在这里没有提到的代码示例的链接
  1. ViewData

    • ViewData是ControllerBase类的属性。
    • ViewData是一种字典对象。
    • ViewData是键值字典集合。
    • ViewData在MVC 1.0版本中被引入。
    • ViewData与. net framework 3.5及以上版本兼容。
    • 在枚举时需要做代码的类型转换。
    • ViewData对象仅为当前请求保存数据。
    • 李< / ul > < / >
    • ViewBag

      • ViewBag是ControllerBase类的属性。
      • ViewBag是一种动态对象。
      • ViewBag是一种对象类型。
      • ViewBag在MVC 3.0版本中被引入。
      • ViewBag适用于。net framework 4.0及以上版本。
      • ViewBag使用属性并处理它,因此不需要进行类型转换 李列举。< / >
      • ViewBag对象仅为当前请求保存数据。
      • 李< / ul > < / >
      • TempData

        • TempData是ControllerBase类的属性。
        • TempData是一种字典对象类型。
        • TempData是键值字典集合。
        • 在MVC 1.0版本中引入了TempData。
        • TempData可用于. net framework 3.5及以上版本。
        • 在枚举时需要做代码的类型转换。
        • TempData对象用于保存当前请求和后续请求之间的数据。
        • 李< / ul > < / >
        • MVC中的会话

          • 会话是控制器(抽象类)的属性。
          • Session是httpessionstatebase的一种类型。
          • 会话是键值字典集合。
          • Session是在MVC 1.0版本中引入的。
          • TempData适用于. net framework 1.0及以上版本。
          • 在枚举时需要做代码的类型转换。
          • 会话对象为所有请求保存数据。对所有请求有效,永不过期。
          • 李< / ul > < / >

ViewBag

  1. 它返回Type Object。
  2. 它是ControllerBase类的dynamic属性。
  3. ViewBag只适用于。net Framework 4.0及以上版本。
  4. 它在使用前不需要类型转换,因为ViewBag属性本质上是dynamic
  5. ViewBag返回动态类型对象,其属性也是dynamic
  6. 它比ViewData快一点。

显示数据

  1. 它返回键值字典对集合。
  2. ViewData是一个字典对象,它是ControllerBase类的属性。
  3. ViewDataViewBag快。
  4. 类型转换代码在枚举时是必需的,因为它是字典对集合。
  5. ViewData返回对象(键值对的类型和值的类型是object,所以你需要在使用前强制转换)

public ActionResult Index()
{
ViewBag.Name = "";
return View();
}


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

视图呼叫

@ViewBag.Name
@ViewData["Name"]