[英]ASP.net MVC View's Model vs ViewData.Model?
我正在学习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"; }
@{ ViewData.Model = "hello"; }
居然能使用@model
声明,导致对“你好”
我想我看得太多了,但为什么会这样呢?
C#和ASP.NET初学者
规则是分离关注...在MVC中,控制器向视图提供模型,它始终是控制器,可以将模型设置/分配给视图....视图可以使用...这个是按设计...按照规则玩是我会说的...如果你正在学习MVC它的伟大,我强烈建议你阅读
像ModelBinders这样的东西有时候不需要在上下文中改变模型,所以他们需要setter。 另一个原因是便于单元测试。
但是,您很少需要自己在视图中执行此操作,因此滥用它需要您自担风险。
它是API设计的“成功之坑”理论。 您不应该在视图中更改Model属性,因此它们会使其变得更难。 但是,由于可能存在您无法选择的情况,因此无法实现。
这里没有魔力。 在第一种情况下(正如您所指出的),Model属性没有属性设置器。 所以,你不能分配任何东西。 这是有道理的 - 为什么你需要从视图中重新分配模型?
在第二种情况下,您直接使用ViewData.Model破解/绕过该约束。 由于它是对象类型,您可以分配任何内容。
(顺便说一句,我假设你在第一个代码片段中指定了“Hello”,而不是“Hello”)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.