如果我们都看 mvc 图, View 不应该知道 Controller 给出的模型(根据 msdn mvc 概述 https://msdn.microsoft.com/en-us/library/dd381412(v=vs.108).aspx )。对我来说,ViewData、ViewBag 和 TempData 违反了这一点,我一直在摸不着头脑,为什么要引入这三个概念。
也许我理解错了?我可以使用模型而不是这三个轻松地将数据传递到 View 。
想知道其他人的意见。
如果您投反对票,请评论原因。
谢谢
I can easily pass data to the view using the models instead of these
three.
是的,你绝对可以,在这种情况下,你的 View 变成了强类型 View ,你可以看到你的 View 开始有一条线
@Model entityName
如果您(出于某种原因)根本不希望您的 View 是强类型的,该怎么办。在这种情况下,您如何看待将数据传递给 View 。
这就是 ViewData
或 ViewBaG
或 TempData
的目的。
the view shouldn't know the models the controller gives out to
我认为您误解了无法达成一致的这条线。如果您的 View 需要在控件中显示数据(可能是编辑 View ),那么如果它不知道从何处读取数据,则将从何处获取数据。
以某种方式或其他方式查看必须知道模型数据(以直接传递模型对象或使用这 3 种技术中的任何一种的形式)。
编辑:
根据您最后的评论:
can i not use this?
public class TestModel
{
public dynamic testproperty { get; set; }
}
是的,也许你可以,但这不是正确的方法。尝试使用模型作为 TestModel
创建强类型 View 并使用任何脚手架模板,看看脚手架是否可以生成合适的模板。
它不会,因为脚手架在内部使用反射来遍历您的模型属性并相应地为这些属性/成员生成控件。由于您拥有动态属性,因此它将无法反射(reflect)该属性。将类型更改为静态类型,如 String
并看到它将生成一个 @Html.DisplayFor(modelItem => item.testproperty)
。 这就是问题所在。
即使您不使用任何脚手架模板并手动生成控件;您将为您的属性(property)生成什么类型的控件?因为它被 tped 为 dynamic
它可以是任何东西(string
、int
、datetime
、email
...).
ViewBag
或 ViewData
是状态管理技术,用于将少量数据通过 View 或 Controller 传递给 View 。您应该始终将您的数据作为模型对象传递给您的 View ,正如@SteveHarris 所正确指出的那样。
希望这能让你明白一些。