我应该如何处理ASP MVC中的聚合模型?

问题描述:

我正在学习ASP MVC和我有问题。我有类公司具有聚合性质:我应该如何处理ASP MVC中的聚合模型?

public class Company 
{ 
    public Company() 
    { 
     Address = new Address(); 
    } 

    public int Id { get; set; }  
    public string Name { get; set; } 
    public virtual Address Address { get; set; } 
} 

和地址类:

public class Address 
{  
    public int Id { get; set; }  
    public string Country { get; set; } 
    public string City { get; set; } 
    ... 
} 

我应该怎么写编辑对这个领域?我试图创建控件AddressDetail并将其传递给Address属性上的UiHint属性,但在视图中,我有其他Id属性来编辑(!?)。当我隐藏它后,模型状态是无效的,因为这个属性是必需的。 另一个问题是,公司库应该如何看待?它应该以某种方式使用AddressRepository或者自己写地址?

也许有人有这种情况的例子吗?

只要地址类有一个参数的构造函数(如贵公司类),默认的MVC模型绑定器将有处理你的对象没有问题。这不是问题,您的公司类和地址类都有一个Id属性。

MVC会默认使用像“身份证”和“Address.Id”,这允许ModelBinder的两个特性区分名指定您inputfields。

你可以在Global.asax中注册一个编辑器模板您的地址类,或者你可以简单的做一个局部视图,并通过它Company.Address在主视图。

+0

它不像创建视图模型一样优雅,但我的简单对象,我不希望创建与映射属性巨大类。编辑器模板是我所需要的。谢谢。 – bizon 2011-03-21 19:02:35

+0

我不确定我会将平面视图模型方法归类为更优雅。在我看来,MVCS能力序列化和deserialise自定义属性类型递归是更真棒featues之一(虽然是最肯定不会是平坦)。 然而,使用图模型可以是在一些情况下,这有利于。 – DEHAAS 2011-03-21 22:00:17

解决此问题的一种方法是创建一个组合这些字段的视图模型。您可以将其传递给视图,并让您的控制器将其转换回您的业务模型。例如:

public class CompanyViewModel 
{   
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Country { get; set; } 
    public string City { get; set; } 
} 

再如,退房“模式3”的位置:http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx

+0

这正是我所做的。但是,要意识到客户可以很容易地将DOM元素中的“Id”更改为除正在更新的Id之外的Id,并导致更新公司的信息。 (这就是为什么'ID'应该由路线来处理) – 2011-03-20 16:06:06

+0

@Jim好点。 – 2011-03-20 18:05:00

+2

@Jim您应该始终具有安全性以验证经过身份验证的用户是否有权编辑实体。永远不要相信客户端发送的数据。 – Ryan 2011-03-21 04:47:25