C# 查看ASP.NET MVC3中的模型模式和使用情况(同时使用EF 4.1)

C# 查看ASP.NET MVC3中的模型模式和使用情况(同时使用EF 4.1),c#,asp.net,asp.net-mvc,asp.net-mvc-3,entity-framework-4.1,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Entity Framework 4.1,几天来我一直在寻找这个问题的答案,这让我发疯。目前,我正在使用ASP.NET MVC 3进行一个项目,并尝试使用ViewModel per controller方法,正如我所查阅的许多文章和教程所建议的那样。为了更好地说明我的问题,我将概述如下: 假设我有一个非常简单直接的模型。用户、客户、地址、电话号码、订单、产品、类别等。。。当用户在我的网站上注册新帐户时,我希望: 1) 为他们创建一个帐户(这只是一个帐户id、客户类型) 2) 将其客户人口统计数据添加到客户 3) 添加N个地址和地址类型

几天来我一直在寻找这个问题的答案,这让我发疯。目前,我正在使用ASP.NET MVC 3进行一个项目,并尝试使用ViewModel per controller方法,正如我所查阅的许多文章和教程所建议的那样。为了更好地说明我的问题,我将概述如下:

假设我有一个非常简单直接的模型。用户、客户、地址、电话号码、订单、产品、类别等。。。当用户在我的网站上注册新帐户时,我希望: 1) 为他们创建一个帐户(这只是一个帐户id、客户类型) 2) 将其客户人口统计数据添加到客户 3) 添加N个地址和地址类型 4) 添加N个电话号码,并键入

据我所知,我需要一个RegistrationControllerServiceWModel的RegisterCustomer。我的困境是这个模型看起来像什么?我试图尽可能地保持干爽,但在实施这一模式时,我似乎在每一个回合都重复自己。我在什么级别放置数据注释进行验证?那么,即使我只想在给定的ViewModel中使用类中的一个属性,我是否只需要新建一个新的Customer()

在这一点上,我甚至不相信这是一个正确的假设。关于这个主题似乎有很多意见,但实施的具体例子却很少。我希望有人能给我指出正确的方向,并在这过程中提供一些代码片段。。。我希望这一切都足够清楚,如果不清楚,请随时提出后续问题


再次感谢您

在应用程序的两个不同层上重复简单属性并不违反DRY。这只是一个很好的设计

数据注释出现在ViewModels上

ViewModel将类似于

public class RegisterCustomerViewModel
{
    [Required]
    public string Name { get; set; }
    public List<AddressViewModels> Addresses { get; set; }
    public List<PhoneNumberViewModel> PhoneNumbers { get; set; |

} 
公共类注册表CustomerViewModel
{
[必需]
公共字符串名称{get;set;}
公共列表地址{get;set;}
公共列表电话号码{get;set|
} 

就像jfar一样,我会采取一种简单的方法:一个视图,一个带有数据注释的视图模型

话虽如此,我知道你的感受(不自信)我理解是因为我自己已经完成了这一点。我的结论是:除非你考虑你的Web应用程序需要很多层次、原则和模式的开销,否则要保持简单。我相信没有完美的体系结构。你需要那种复杂性


以我的第一句话作为对你问题的回答,其余的作为我的拙见。

这很好,但现在你的UI层中有了业务逻辑。你的业务层还需要执行名称要求规则,否则,无论下一个UI是什么,你都会丢掉MVC UI。@Andy:你应该执行验证在应用程序的每一个级别。我不认为@jfar暗示了其他方面。@Andy,这不是业务逻辑,这是您在UI级别上需要做的工作。DataAnnotations属性可以在另一个UI层中使用。没有限制,并且是为此目的而设计的。我认为这是业务逻辑。您愿意吗你曾经允许某人注册而不输入他们的名字吗?谁打电话?可能是业务,这是一条不管用户界面如何都要遵守的规则。是的,你可以在其他层中重用数据注释,但你必须自己弄清楚如何运行它们。我不知道有任何引擎为你处理这些问题。另外,除非你让您的业务层看到您的虚拟机(我个人不这么认为),您必须在业务模型上重复注释,换句话说,您需要在两个地方重复注释,否则会有问题。@jfar-Hmmmm这很有趣。我从来没有想过我需要为要包含在ViewModel中的Address或PhoneNumber视图模型创建类。我只会使用主谢谢你们的意见。