我正在学习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
答案 0 :(得分:8)
规则是分离关注......在MVC中,控制器向视图提供模型,它始终是控制器,可以将模型设置/分配给视图....视图可以使用。 ..这是设计......按规则玩是我会说的......如果你正在学习MVC它很棒,我强烈建议你阅读
答案 1 :(得分:2)
像ModelBinders这样的东西,有时候不需要在上下文中改变模型,所以他们需要setter。另一个原因是便于单元测试。
但是,您很少需要在视图中自行执行此操作,因此请自行承担风险。
答案 2 :(得分:2)
这是API设计的“成功之坑”理论。您不应该在视图中更改Model属性,因此它们会使其变得更难。但是,由于可能存在您无法选择的情况,因此无法实现这一目标。
答案 3 :(得分:1)
这里没有魔力。在第一种情况下(正如您所指出的),Model属性没有属性设置器。所以,你不能分配任何东西。这是有道理的 - 为什么你需要从视图中重新分配模型?
在第二种情况下,您直接使用ViewData.Model破解/绕过该约束。由于它是对象类型,您可以指定任何内容。
(顺便说一句,我假设您在第一个代码段中指定了“Hello”,而不是“Hello”)