我正在学习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还是单独写地址?
也许有人有这种情况的例子?
答案 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。