我有一个公司模型的应用程序。Company 模型具有到 Address 模型的导航属性(一对一关系):
公司.cs
public class Company
{
public int CompanyID { get; set; }
public string Name { get; set; }
// Snip...
public virtual Address Address { get; set; }
}
我创建了一个视图模型来处理编辑、详细信息和创建操作:
CompanyViewModel.cs
public class CompanyViewModel
{
public int CompanyID { get; set; }
[Required]
[StringLength(75, ErrorMessage = "Company Name cannot exceed 75 characters")]
public string Name { get; set; }
// Snip...
public Address Address { get; set; }
}
我在控制器中使用 AutoMapper 在模型和视图模型之间来回映射,一切正常。但是,我现在想对地址对象使用验证 - 我不希望在没有地址的情况下创建公司。
我的第一个想法是简单的路线 - 我尝试在 Address 属性上放置一个“[Required]”注释。这没有做任何事情。
然后我认为最好取消 Address 属性并在视图模型中抽象该数据,因此我将属性添加到视图模型中,用于我的 Address 类中的所有属性:
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public string PostalCode { get; set; }
// etc....
这似乎是一个很好的做法,但现在我的 AutoMapper 无法将这些属性映射到 Company 类的 Address 对象,所以我不得不在控制器中手动映射:
public ActionResult Details(int id = 0)
{
// Snip code retrieving company from DB
CompanyViewModel viewModel = new CompanyViewModel();
viewModel.Name = company.Name;
viewModel.Address1 = company.Address.Address1;
// Snip...
return View(viewModel);
}
这导致我的控制器中有很多额外的代码,而不是一个很好的单行 AutoMapper 语句......那么处理这个问题的正确方法是什么(在视图模型中验证嵌套模型)?
直接在视图模型中公开 Address 属性是一种好习惯,还是更好地像我所做的那样使用单独的属性将其抽象出来?
AutoMapper 可以在源和目标不完全匹配的情况下工作吗?