ASP.net MVC View的模型与ViewData.Model?

时间:2012-03-28 23:40:15

标签: c# asp.net asp.net-mvc asp.net-mvc-3 razor

我正在学习asp.net mvc并发现了一些有趣的东西:

我似乎无法在View中明确定义View Model,但错误消息显示它没有setter。

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

然后我查看了WebViewPage.cs中的源代码,View的Model属性实际上是这样的:

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

因此错误。

但有趣的是我能做到这一点:@{ ViewData.Model = "hello"; }并且实际上能够使用@model语句,从而导致“你好”

我想我太过分了,但为什么会这样呢?

初学者在C#和ASP.NET

4 个答案:

答案 0 :(得分:8)

规则是分离关注......在MVC中,控制器向视图提供模型,它始终是控制器,可以将模型设置/分配给视图....视图可以使用。 ..这是设计......按规则玩是我会说的......如果你正在学习MVC它很棒,我强烈建议你阅读

Stevens Sandersons MVC book

答案 1 :(得分:2)

像ModelBinders这样的东西,有时候不需要在上下文中改变模型,所以他们需要setter。另一个原因是便于单元测试。

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

答案 2 :(得分:2)

这是API设计的“成功之坑”理论。您不应该在视图中更改Model属性,因此它们会使其变得更难。但是,由于可能存在您无法选择的情况,因此无法实现这一目标。

答案 3 :(得分:1)

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

在第二种情况下,您直接使用ViewData.Model破解/绕过该约束。由于它是对象类型,您可以指定任何内容。

(顺便说一句,我假设您在第一个代码段中指定了“Hello”,而不是“Hello”)