public class HomeController : Controller
{
public ActionResult Index()
{
var emp = new Empleado
{
IdEmpleado=101,
Nombre = "Pedro",
Salario = 3500,
Direccion = "Chiapas"
};
ViewData["emp"] = emp;
ViewBag.Empleado = emp;
return View();
}
}
看法:
@model MyProject.Models.Empleado;
@{
Layout = "~/Views/Shared/_Layout.cshtml";
ViewBag.Title = "Bienvenido";
var viewDataEmpleado = ViewData["emp"] as Empleado; //se hace el casting
}
<h2>Bienvenido</h2>
Mejor empleado del año!
<h4>@ViewBag.Empleado.Nombre</h4>
<h3>@viewDataEmpleado.Nombre</h3>
基本上,差异包括以下内容:
ViewData
ViewData
key
是一个强类型字典对象,通过熟悉的“ /value
”语法将数据输入其中。ViewData
从类派生ViewDataDictionary
。ViewData["Dato"] = 1
@ViewData["Dato"]
ViewBag
ViewBag
是一个动态类型的对象,允许您动态创建属性。ViewBag.Dato = 1
@ViewBag.Dato
一般来说,使用一个或另一个(我认为)将取决于最适合您的方式,两者都可以让您将信息从控制器传递到视图,除非您想在多个请求期间携带该信息,因此在这种情况下,请考虑将数据字典
TempData
与其 . 结合使用Keep()
。官方文档参考:
ViewData
ViewBag
TempData
ViewBag
只是一个包装ViewData
。不同之处在于,虽然它ViewData
是类型ViewDataDictionary
(它实现了 aIDictionary<string, object>
,但它ViewBag
是dynamic
稍微简化代码的类型。例子:
至于性能差异应该可以忽略不计,最好担心其他可能真正成为瓶颈的地方,例如数据库访问
至于哪个更好,of的语法
dynamic
稍微短一些,但这是一个口味问题。请注意,这两个选项都不是强类型的,如果在这种情况下键入错误的键,可能会导致运行时错误Persona
。理想的实际上是通过一个在控制器和视图之间传递所有信息Model
实际上,它们仍然是同一枚硬币的两个方面。
主要区别在于 ViewData 是一个对象字典,您可以在其中通过字符串访问 Object 类型的元素,而 ViewBag 是一个动态对象,您可以在其中通过动态创建的属性访问元素并且可以具有定义的数据类型。
事实上,MVC 将信息存储在同一个容器中,以便控制器中定义的值 as
ViewData["dato1"] = xxxxx
可以从视图中访问,ViewBag.dato1
反之亦然。它们都具有将数据从控制器传递到视图的相同目标。
ViewData 是 Object 类型,您必须在视图中强制转换才能使用它,而 ViewBag 是使用分配的数据类型动态生成的。
ViewData:需要对复杂类型的数据进行类型转换,并检查空值以避免错误。
ViewBag:不需要对复杂数据类型进行类型转换。
控制器:
看法:
首先感谢您的回复。他们已经澄清了我的疑问,但是我想发布另一个答案以帮助澄清这个问题,尽管我认为他们已经很好地涵盖了所有内容。
从技术上讲,所有数据都通过称为 ViewData 的 ViewDataDictionary(一个专门的字典类)从控制器传递到视图。您可以使用标准字典语法在 ViewData 字典中设置和读取值,如下所示:
尽管这仍然可用,但 ASP.NET MVC 3 利用 C# 4 动态关键字来允许更简单的语法。ViewBag 是一个围绕 ViewData 的动态容器。允许您按如下方式设置值:
因此,ViewBag.CurrentTime 等价于 ViewData["CurrentTime"]。通常,您将遇到的大多数实际代码大部分都使用 ViewBag 而不是 ViewData。在选择一种语法而不是另一种语法时,您没有真正的技术优势。ViewBag 只是一些人更喜欢字典语法的语法快捷方式。它只是看起来更好。
尽管您在选择一种格式而不是另一种格式时可能没有技术优势,但您应该注意两者之间的一些重要区别。语法一个明显的区别是 ViewBag 仅在您访问的键是 C 标识符时才有效。#有效. 例如,如果您在 ViewData ["Key With Spaces "] 中放置一个值,则无法使用 ViewBag 访问该值,因为代码无法编译。另一个需要考虑的关键问题是动态值不能作为参数传递给扩展方法。C# 编译器必须在编译时知道每个参数的实际类型才能选择正确的扩展方法。如果任何参数是动态的,则构建将失败。例如,此代码总是失败:@Html.TextBox("name", ViewBag. 芋头)。为避免这种情况,请使用 ViewData["Name"] 或将值转换为特定类型:(字符串)ViewBag.Name。
ViewDataDictionary 是一个专门的字典类,而不仅仅是一个通用的 Dictionary 。原因之一是它有一个额外的模型属性,允许视图可以使用特定的模型对象。因为在 ViewData 中只能有一个模型对象,所以使用它来将特定的类传递给视图很方便。这允许您的视图指定期望所需模型对象的类,这意味着您可以利用强类型。
这是从我认为是我读过的最好的书之一的书中翻译的专业 ASP.Net MVC5