ViewData,ViewBag和TempData违反了MVC?

时间:2015-12-31 14:57:31

标签: c# asp.net-mvc

如果我们都看一下mvc图,那么视图就不应该知道控制器给出的模型(根据msdn mvc overview https://msdn.microsoft.com/en-us/library/dd381412(v=vs.108).aspx)。对我来说,ViewData,ViewBag和TempData违反了这一点,我一直在为这三个概念的引入而烦恼。

也许我弄错了?我可以使用模型而不是这三个模型轻松地将数据传递给视图。

想了解其他人的意见。

如果你投票,请评论原因。

谢谢

1 个答案:

答案 0 :(得分:1)

  

我可以使用模型而不是这些模型轻松地将数据传递给视图   3。

是的,绝对可以,在这种情况下,您的视图会成为强类型视图,您可以看到视图的开头有一行

@Model entityName

如果您不希望(由于某种原因)您的视图被强烈打字,该怎么办?在这种情况下,您认为如何传递数据进行查看。

这是ViewDataViewBaGTempData的目的。

  

视图不应该知道控制器给出的模型

我认为你误解了这条无法达成一致意见的界限。如果您的视图需要在控件中显示数据(可能是编辑视图),那么如果它不知道从何处读取数据,那么它将从何处获取数据。

以某种方式查看或以其他方式必须知道模型数据(以直接传递Model对象或使用这3种技术中的任何一种的形式)。

修改

根据您的上一条评论:

  

我可以不使用它吗?

public class TestModel 
{ 
    public dynamic testproperty { get; set; } 
}

是的,可能你可以,但这不是一个正确的方法。尝试使用模型TestModel创建强类型视图,并使用任何支架模板,看看脚手架是否可以生成正确的模板。

它不会,因为脚手架在内部使用反射来遍历您的模型属性,并相应地为这些属性/成员生成控件。由于您具有动态属性,因此无法反映该属性。将类型更改为静态类型,如String,并看到它将生成@Html.DisplayFor(modelItem => item.testproperty)这就是问题

即使您不使用任何脚手架模板并用手生成控件;您将为您的物业产生什么类型的控制?因为它被标记为dynamic,所以它可以是任何内容(stringintdatetimeemail ...)。

ViewBagViewData是状态管理技术,用于将视图或控制器的少量数据传递给视图。您应该始终将数据作为Model对象传递给您的视图,如@SteveHarris所述。

希望这在某种意义上说清楚。