Asp.net mvc 对.NETMVC视图模型和模型感到困惑

Asp.net mvc 对.NETMVC视图模型和模型感到困惑,asp.net-mvc,mvvm,Asp.net Mvc,Mvvm,所以,我读了一些关于.net和MVC的书。我记得读过一些建议在MVC中使用ViewModels的文章。这将有助于减少视图与应由控制器控制的数据相混淆的愿望 我认为这就是MVVM模式所指的。显然,在研究了这一点之后,该实现实际上完全取消了控制器。不完全是我想做的 在我的案例中使用ViewModel合法吗?是更好的练习还是不必要的工作?您将把ViewModels目录/命名空间放在哪里?在模型目录下 模特了解ViewModels合法吗?例如,您有一个模型将ViewModel返回给控制器?我认为设计模式

所以,我读了一些关于.net和MVC的书。我记得读过一些建议在MVC中使用ViewModels的文章。这将有助于减少视图与应由控制器控制的数据相混淆的愿望

我认为这就是MVVM模式所指的。显然,在研究了这一点之后,该实现实际上完全取消了控制器。不完全是我想做的

在我的案例中使用ViewModel合法吗?是更好的练习还是不必要的工作?您将把ViewModels目录/命名空间放在哪里?在模型目录下


模特了解ViewModels合法吗?例如,您有一个模型将ViewModel返回给控制器?

我认为设计模式不是严格的概念,而是帮助您更好地构建应用程序的指导原则。Model-View-ViewModelMVVM设计模式源自WPF,WPF中有一个非常健壮的Bata绑定框架来促进该模式。其思想是,您的模型中有业务数据,但由于通常存在视图特定的数据,即树控件中当前选定的项不属于模型,因此您创建了包装模型的视图模型对象,但视图模型也包含视图特定的状态数据。因此,您的视图可以绑定到视图模型,而不是直接绑定到模型对象,从而保持模型干净,易于测试、维护等


net MVC的不同之处在于,视图中的数据绑定远不如WPF中的强大。在WPF中,实际上可以通过数据绑定实现大部分GUI和模型数据交互,这使得视图模型非常有用。但是在Asp.net MVC中,您的控制器设计用于处理此问题,而且由于数据绑定几乎不存在,因此我不认为在Asp.net MVC中在模型对象周围设置视图模型包装器有什么价值。

我认为设计模式不是僵化的概念,而是帮助您更好地构建应用程序的指导原则。Model-View-ViewModelMVVM设计模式源自WPF,WPF中有一个非常健壮的Bata绑定框架来促进该模式。其思想是,您的模型中有业务数据,但由于通常存在视图特定的数据,即树控件中当前选定的项不属于模型,因此您创建了包装模型的视图模型对象,但视图模型也包含视图特定的状态数据。因此,您的视图可以绑定到视图模型,而不是直接绑定到模型对象,从而保持模型干净,易于测试、维护等


net MVC的不同之处在于,视图中的数据绑定远不如WPF中的强大。在WPF中,实际上可以通过数据绑定实现大部分GUI和模型数据交互,这使得视图模型非常有用。但是在Asp.net MVC中,您的控制器设计用于处理此问题,而且由于数据绑定几乎不存在,因此我看不出在Asp.net MVC中的模型对象周围有视图模型包装器的价值。

模型和视图模型是不同的。不要将ViewModel与MVVM模式混淆

使用视图模型可以使模型和视图之间的交互更加简单。模型有时可能过于复杂,将其他模型对象作为成员,这可能会将模型对象作为成员等


通过使用视图模型,可以很好地简化视图处理的内容。这还将过滤intellisense中可以看到的内容,因此,如果开发模型的人员与处理视图的人员不同,那么创建简单的视图模型可以让那些只处理UI的人更容易。

模型和视图模型是不同的。不要将ViewModel与MVVM模式混淆

使用视图模型可以使模型和视图之间的交互更加简单。模型有时可能过于复杂,将其他模型对象作为成员,这可能会将模型对象作为成员等


通过使用视图模型,可以很好地简化视图处理的内容。这还将过滤intellisense中可以看到的内容,因此,如果开发模型的人员与处理视图的人员不同,那么创建简单的视图模型可以让那些只处理UI的人更容易。

默认情况下,MVC项目中不使用视图模型。如果您觉得将视图更容易地耦合到模型中对您有好处,则需要添加它

ViewModel的概念不仅仅适用于ASP.NET MVC,您将在有关MVC、MVP和MVVM模式的文章和博客文章中看到web上对ViewModels的引用。这些帖子和文章可以围绕任意数量的技术,如ASP.NET、Silverlight、WPF或MVC。。。本文将研究ViewModels在ASP.NETMVC世界中的应用


默认情况下,视图模型不在中 MVC项目。如果您觉得将视图更容易地耦合到模型中对您有好处,则需要添加它

ViewModel的概念不仅仅适用于ASP.NET MVC,您将在有关MVC、MVP和MVVM模式的文章和博客文章中看到web上对ViewModels的引用。这些帖子和文章可以围绕任意数量的技术,如ASP.NET、Silverlight、WPF或MVC。。。本文将研究ViewModels在ASP.NETMVC世界中的应用


我参与了一个使用jqgrid的asp.NETMVC项目。jqgrid需要特定的请求和响应数据结构。所以我创建了特定的视图模型来使用jqgrid。对于控制器操作的简单输入数据,如简单值类型、字典类型、IEnumerable类型,asp.net mvc通常可以理解如何绑定到这些数据。希望添加对此的引用,但不确定它是否符合任何特定的答案,因此我将把它放在这里:我在使用jqgrid的asp.net mvc项目上。jqgrid需要特定的请求和响应数据结构。所以我创建了特定的视图模型来使用jqgrid。对于控制器操作的简单输入数据,如简单值类型、字典类型、IEnumerable类型,asp.net mvc通常可以理解如何绑定到这些数据。希望添加对此的引用,但不确定它是否符合任何特定答案,因此我将其放在此处:您可能看不到值,但它就在那里。首先,如果您通过数据注释使用ASP.NET MVC的内置验证,那么使用带有验证属性的独立视图模型比污染域对象要干净得多。此外,您可以根据特定的视图需求定制视图模型,有点像视图的DTO。@Chris-您认为实体级安全性实现属于视图模型层而不是域模型吗?目前我正在考虑向我的每个实体添加安全id字段,但这似乎污染了我的域,因为如果我使用不同的安全提供程序或框架,我可能需要更改域实体中所有特定于安全性的字段。@Chris-我想知道ViewModel/Model问题,因为至少在.Net中,可以将ViewModel/模型作为控制器中动作方法的参数。然后.Net自动填充表单提交或常规请求中的值。如果使用ViewModel,则每次都必须执行额外的步骤才能将数据从ViewModel中获取到模型中。另一方面,您的操作方法可能需要由多个模型表示的数据,因此ViewModel在这种情况下非常有用。@Walt-将视图模型映射到模型的问题就是像AutoMapper这样的东西被发明的原因。如果在action方法参数中传递域模型对象,则ASP.NET MVC也可以自动绑定表单属性以查看模型属性,只要域对象属性与表单字段名对齐,但同样,您将向视图公开复杂的域详细信息,这可能不是必需的。同样,为了澄清,我通常认为ViewModels只不过是视图的DTO对象,可能还加入了一些表示层细节。@dan_l,我不确定您的代码是如何构造的,但是如果您担心以后更改提供程序,然后,您的特定于安全性的字段似乎是进一步抽象的完美候选者。您也许可以创建一个附加到每个对象的ISecurityInfo实现,并使用一个ISecurityProvider实现来执行必要的安全检查。如果您以后需要更改框架或安全提供程序,您可以很容易地这样做。您可能看不到它的价值,但它确实存在。首先,如果您通过数据注释使用ASP.NET MVC的内置验证,那么使用带有验证属性的独立视图模型比污染域对象要干净得多。此外,您可以根据特定的视图需求定制视图模型,有点像视图的DTO。@Chris-您认为实体级安全性实现属于视图模型层而不是域模型吗?目前我正在考虑向我的每个实体添加安全id字段,但这似乎污染了我的域,因为如果我使用不同的安全提供程序或框架,我可能需要更改域实体中所有特定于安全性的字段。@Chris-我想知道ViewModel/Model问题,因为至少在.Net中,可以将ViewModel/模型作为控制器中动作方法的参数。然后.Net自动填充表单提交或常规请求中的值。如果使用ViewModel,则每次都必须执行额外的步骤才能将数据从ViewModel中获取到模型中。另一方面,您的操作方法可能需要由多个模型表示的数据,因此ViewModel在这种情况下非常有用。@Walt-将视图模型映射到模型的问题就是
汽车制造商被发明了。如果在action方法参数中传递域模型对象,则ASP.NET MVC也可以自动绑定表单属性以查看模型属性,只要域对象属性与表单字段名对齐,但同样,您将向视图公开复杂的域详细信息,这可能不是必需的。同样,为了澄清,我通常认为ViewModels只不过是视图的DTO对象,可能还加入了一些表示层细节。@dan_l,我不确定您的代码是如何构造的,但是如果您担心以后更改提供程序,然后,您的特定于安全性的字段似乎是进一步抽象的完美候选者。您也许可以创建一个附加到每个对象的ISecurityInfo实现,并使用一个ISecurityProvider实现来执行必要的安全检查。如果您以后需要更改框架或安全提供程序,那么您可以很容易地这样做?这应该在其他地方吗?没关系,这取决于你,在我的项目中,我通常创建一个ViewModel文件夹。@Walt-大多数非平凡项目将其业务和数据层放在不同的项目中,这使得MVC中的Models文件夹严格用于视图模型。如果你不这样做,那么你可以很容易地创建一个ViewModels文件夹来创建一个分离。这没关系,我以前也这么做过。现在我倾向于创建更多的文件夹,如ViewModels Infrastructure,以及更多的项目,如projectname.Data和projectname.Core和projectname.Test等。。明确命名文件夹,明确它们的用途。那么您会将ViewModels命名空间放在模型命名空间下吗?这应该在其他地方吗?没关系,这取决于你,在我的项目中,我通常创建一个ViewModel文件夹。@Walt-大多数非平凡项目将其业务和数据层放在不同的项目中,这使得MVC中的Models文件夹严格用于视图模型。如果你不这样做,那么你可以很容易地创建一个ViewModels文件夹来创建一个分离。这没关系,我以前也这么做过。现在我倾向于创建更多的文件夹,如ViewModels Infrastructure,以及更多的项目,如projectname.Data和projectname.Core和projectname.Test等。。明确命名文件夹,明确它们的用途。那么模型可以将视图模型返回给控制器?出于某种原因,我认为它应该保持对视图数据的忽略,并且控制器应该是将模型数据发送到ViewModel,然后将其传递到视图的那个人。所以模型可以将视图模型返回给控制器?出于某种原因,我认为它应该保持对视图数据的忽略,并且控制器应该是将模型数据发送到ViewModel,然后将其传递到视图的控制器。