c# - ViewData、ViewBag 和 TempData 是否违反了 MVC?

标签 c# asp.net-mvc

<分区>

如果我们都看 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 。

这就是 ViewDataViewBaGTempData 的目的。

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 它可以是任何东西(stringintdatetimeemail...).

ViewBagViewData 是状态管理技术,用于将少量数据通过 View 或 Controller 传递给 View 。您应该始终将您的数据作为模型对象传递给您的 View ,正如@SteveHarris 所正确指出的那样。

希望这能让你明白一些。

关于c# - ViewData、ViewBag 和 TempData 是否违反了 MVC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34548090/

相关文章:

c# - 正则表达式从字符串中选择 csv 值

c# - 使用 C# 将 UTC 转换为 IST

c# - URL 的 Path.Combine(第 2 部分)

c# - 有什么简单的方法可以根据 C# 中的键对 NameValueCollection 进行排序?

c# - 隐藏来自 ASP.NET MVC 中操作的路由值?

c# - 如何合并两个asp.net mvc网站

asp.net-mvc - ASP.NET MVC 中可能出现表单值被替换的错误

c# - Azure Active Directory 获取所有用户 - (可能死锁)

asp.net-mvc - Asp Net MVC 与 VM 这是一个好的实践吗? (代码示例)

.net - Dapper:找不到方法: 'System.Collections.Generic.IEnumerable` 1&lt;!!0> GridReader.Read(Boolean)'