Asp.net mvc 我是否误用或误解了MVC中的viewmodels?

Asp.net mvc 我是否误用或误解了MVC中的viewmodels?,asp.net-mvc,design-patterns,viewmodel,entities,asp.net-mvc-viewmodel,Asp.net Mvc,Design Patterns,Viewmodel,Entities,Asp.net Mvc Viewmodel,我在MVC中使用ViewModels。我发现他们非常笨拙,不知道我是否做错了什么。(为了便于讨论,让我们将Automapper排除在外。)我使用viewmodels向客户端发送数据以及接收表单提交。某些属性发送到浏览器仅用于显示,其他属性则发送和检索(如字段) 我通常必须实现以下功能才能使viewmodel正常工作: 1) 创建视图模型类 2) 创建一个常规函数来初始化视图模型并从“我的实体”和其他源复制属性 3) 编写更多代码,以便在提交时将一些值从viewmodel写回实体(或其他目标) 4

我在MVC中使用ViewModels。我发现他们非常笨拙,不知道我是否做错了什么。(为了便于讨论,让我们将Automapper排除在外。)我使用viewmodels向客户端发送数据以及接收表单提交。某些属性发送到浏览器仅用于显示,其他属性则发送和检索(如字段)

我通常必须实现以下功能才能使viewmodel正常工作:

1) 创建视图模型类

2) 创建一个常规函数来初始化视图模型并从“我的实体”和其他源复制属性

3) 编写更多代码,以便在提交时将一些值从viewmodel写回实体(或其他目标)

4) 如果存在服务器端验证错误,我需要编写更多代码(尤其是凌乱的代码)来重新填充viewmodel的只读部分(包括在提交中),同时注意不要覆盖用户提交的数据

对于一个简单的属性(例如“myViewModel.FirstName”),这需要在不少于4个位置编写代码。这还不包括域和视图中的内容。这种模式对我来说似乎很脆弱——很容易破坏代码,例如,忘记在所有位置实现更改。绝对不干


我是没有抓住要点,还是所有使用ViewModel的图案都有这种笨拙?

我不确定你会发现什么笨拙?MVC是关于关注点分离的。将业务逻辑、数据层和GUI代码分开。这本身使您的代码更易于管理、测试和调试

让我们看看你的四点

第1点。首先,为视图模型创建POCO真的有那么大的问题吗?我不这么认为,因为根据您的示例,您可以在大约3行代码中完成这项工作。如果您的模型需要更改,那么将它放在自己的视图模型类中,而不是直接放在您可能使用过它的每个控制器中的每个操作方法的代码中,不是更有益吗

第2+3点。在这里,您讨论的是从数据层到逻辑层再到视图再到视图。这就是MVC的全部要点。仅仅因为您可能需要编写三个类(模型、服务、存储库)来处理此事务,这并不会使它变得麻烦,而是使它变得干净。想象一下,如果您将所有这些都放在控制器操作方法上。您将如何处理重复使用?如何防止在其他操作或控制器中重复代码?事情将开始变得非常困难


第4点。我并不认为这是一个有效的参数,因为您可以直接传回用户提交的模型,而无需对其进行更新或编辑。通过使用数据注释和ModelState进行验证,创建干净且可测试的代码单元非常简单。因此,我认为这不是您使用ViewModel的事实,而是与您的实现有关。

谢谢David。我列出的4点不是参数,而是为了添加一个简单字段而必须添加代码的所有地方。(除了域和视图之外)。{{因为您可以直接传回用户提交的模型,而无需更新或编辑它}-事实并非如此!如果viewmodel有任何“只读”字段(例如,传递给视图用于显示的值,但没有用户驱动的字段),则提交表单时,viewmodel上的这些字段将为空。(黑客就是把它们都隐藏起来,这样它们就可以包含在提交的数据中。)解决这个问题的典型方法是什么?这取决于你为什么使用只读字段。通常我从不这样做,因为在实践中,我把来自用户的任何东西都视为危险的,只处理我知道应该更新的属性。因此,如果您要输出全名以供显示,则有2个选项。使用普通属性&包括找到的隐藏字段,该字段允许您将模型传回。或者,在处理了您希望更新的属性后,重新使用获取此数据的方法。我见过将显示数据放在会话中以供重用的项目,但我认为这是一种相当混乱的方法。。。汽车制造商。