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

时间:2011-03-20 13:34:13

标签: c# asp.net-mvc asp.net-mvc-3

我正在学习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还是单独写地址?

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

只要Address类有一个无参数构造函数(就像你的公司类一样),默认的mvc modelbinder对你的对象没有任何问题。您的Company类和Address类都具有Id属性,这不是问题。

默认情况下,MVC会为您的输入字段分配“Id”和“Address.Id”等名称,这样可以让模型绑定器区分这两个属性。

您可以在Global.asax中为您的地址类注册一个编辑器模板,或者您可以简单地制作局部视图并在主视图中将其传递给Company.Address。