2012-03-28 113 views
6

我正在学习asp.net的MVC,发现一些有趣的事情:ASP.net MVC视图模型vs ViewData.Model?

看来,我不能显式定义视图的Model从视图中具有错误消息说,它没有制定者。

@{ this.Model = "Hello" } //error

然后我看了看源代码WebViewPage.cs和视图的Model属性其实是这样的:

public object Model { get { return ViewData.Model; } }

这样的错误。

但我怎么能做到这一点很有趣:@{ ViewData.Model = "hello"; }居然能使用@model声明,导致对“你好”

我想我期待太多进去,但是为什么会这样呢?在C#

初学者和ASP.NET

+0

@BrokenGlass可能你需要更好地阅读他的问题,它的一个新手有点问题...它相当有用/有助于解释它... – NiK 2012-03-28 23:49:07

+0

@Jan Carlo Viray你能澄清一下你的问题吗? '为什么'是什么? – 2012-03-28 23:52:56

+0

我其实从来不知道'@ Model'包含在'ViewData'字典中。令人震惊的是,因为我已经听说了几个备受推崇的资源** RAIL **反对使用ViewData,但它在这里被嵌入到框架中。 – 2012-03-29 05:22:26

回答

7

该规则是关注分离...在MVC中,控制器为视图提供模型,并且它始终是可以将模型设置/分配给视图的控制器....视图可以使用......这是由设计......通过游戏规则是我要说的话......如果你正在学习MVC的伟大,我会强烈建议您阅读

Stevens Sandersons MVC book

2

之类的东西ModelBinders,什么不该有时需要改变模型的情况下,所以需要制定者。另一个原因是促进单元测试。

但是,您很少需要自己在视图中执行此操作,因此请自行承担风险。

1

有没有神奇这里。在第一种情况下(正如您所指出的那样),Model属性没有属性设置器。所以,你不能分配任何东西。这是有道理的 - 为什么你需要从视图内重新分配模型?

在第二种情况下,您直接使用ViewData.Model来篡改/绕过该约束。由于它是对象类型,所以你可以指定任何东西。

(顺便说一句,我认为在第一个代码段分配“你好”,而不是“你好”)

2

这是API设计理论“成功的坑”。你不应该改变你的视图中的Model属性,所以它们会使得难以做到这一点。但是,由于可能有些情况下你没有选择,他们不会让它变得不可能。