繁体   English   中英

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

[英]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它的伟大,我强烈建议你阅读

史蒂文斯桑德森MVC书

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM