我是MVC的新手。
我已经阅读了这篇简短的内容,详细介绍了在MVC中处理视图模型的三种方法:
http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx
在我看来,它的主旨是:
方法1,将对象拉出数据库并将其用作视图模型。快速而简单,但是如果你想要来自多个表的数据,你就完全搞砸了(如果没有方法2,我想不出办法)。
方法2,创建一个引用多个对象的类,并将其用作视图模型。这样您就可以访问所需的一切。文章说,当视图变得复杂时,由于域/视图模型对象之间的阻抗不匹配而导致故障......我不明白这意味着什么。谷歌搜索阻抗不匹配返回了很多东西,它的主旨是你使用对象和东西代表数据库的东西不能干净地映射,但你可能会遇到这个问题,即使使用方法1.不确定我是什么失踪。在我看来,从维护的角度来看,为每个View创建一个类以获取所需的数据并不理想,不确定您是否有选择。
方法3,我仍然在理解它,但是我不太明白为什么他们的复选框示例在方法2中不起作用,如果你在你的类中添加了一个bool addAdditional而没有连接到领域模型。
方法3似乎说而不是直接返回域名的东西,只是提取你特别需要的属性,我认为这样更好但是因为你需要一些this.x = domain.x
的大型构造函数而难以维护, this.y = domain.y
等。
我不了解构建器,特别是使用接口的原因,但会继续使用它。
编辑:我刚才意识到这不是一个真正的问题,我的问题是,我的想法是否正确?
答案 0 :(得分:1)
我遇到的#2问题是我必须做以下两件事之一:
在表单上的每个单个对象上包含每个字段 - 那些不会显示的字段需要包含但隐藏。
仅包含我需要的特定字段,但使用AutoMapper或类似字段将这些字段映射回实际对象。
因此,对于#2,我发现我想要做的事与我需要做的事情之间存在不匹配。如果我们继续讨论#3,那么这个不匹配就会被删除(根据我的理解,简要地瞥了一眼)。它还修复了一个问题,即确定的黑客在使用方法#2时可以提交id字段或类似的值,除非我非常小心,否则可以写入我的数据存储。换句话说,除非非常小心,否则可以更新任何对象上的任何内容。
使用方法#3,您可以使用AutoMapper或类似方法执行将自定义对象映射到数据存储对象的脏工作,而不必担心方法#2暴露的安全问题/阻抗(有关安全问题的详细信息,请参阅注释)与#2)。
答案 1 :(得分:0)
你可能在方法1和方法2中都存在阻抗不匹配的问题 - 它出现在你在代码中的对象和具有关系映射的数据库对象之间的任何地方。 Jeff Atwood写了关于它的内容,引用了this article,这是关于对象关系映射或“计算机科学的越南”的一切的精彩讨论。你最终要做的就是权衡所有这些方法的优点和缺点,选择一个听起来最符合你需求的方法,然后再意识到你选错了方法。或许你比我更幸运,并且可以在第一轮比赛中做到正确。无论哪种方式,这都是一个毛茸茸的问题。