在使用ViewModel之前,我可以轻松地将“即将被编辑”的对象直接传递给视图,而无需为设置单个属性等而烦恼,因为View方便地直接接受了Employee类型..
[HttpGet]
public ActionResult EditEmployee(int? id)
{
EmployeeRepository ER = new EmployeeRepository();
Employee SomeEmployee = ER.GetEmployee(id.Value);
if(SomeEmployee!=null)
return View(SomeEmployee);
但是现在我正在使用一个ViewModel,其中DataAnnotations属性应用于各种属性的顶部以进行验证。这会产生问题..
从db中获取“即将被编辑”的对象后,设置ViewModel的值突然变得复杂得多。我不能简单地将检索到的对象直接传递给视图,因为View现在需要VMEmployee类型。
我希望能够做到这样的事情:
[HttpGet]
public ActionResult EditEmployee(int? id)
{
EmployeeRepository ER = new EmployeeRepository();
Employee SomeEmployee = ER.GetEmployee(id.Value);
if(SomeEmployee!=null)
return View(new VMEmployee(SomeEmployee));
所有路径似乎都会导致一个巨大的构造函数,它手动设置每个属性的值。但是在我没有使用ViewModel之前,我从来没有这么做过。模型绑定是一种祝福!
我的对象也有复杂的子对象,我的表单也在为它们收集值,所以这对DRY主体来说是一个巨大/冗长的任务。
我甚至不想使用ViewModel,但我被迫使用,因为我需要两个不同的DataAnnotations规则集,用于应用于同一对象的不同验证方案。
我想要做的就是能够为不同的场景设置两个不同的DataAnnotations规则集。即面向公众的www站点与面向内部的管理站点。 DataAnnotations似乎不够灵活,无法轻松满足这一共同需求。
我已经尝试过AutoMapper,但它会抛出一个错误,说它无法映射我的对象类型,我怀疑是因为Employee是由LINQ to SQL自动生成的。
在坚持DRY校长的同时实现这一目标的最优雅方法是什么?
答案 0 :(得分:0)
我会定义一个映射类,其唯一目的是将Employee
映射到VMEmployee
。映射仍然需要存在,但理想情况下,viewmodel不需要关心这样做。然后,您可以对此进行单元测试,以确保所有内容都已映射。
为方便起见,您可以考虑使用Automapper之类的内容。但是,我倾向于发现手动编写映射代码最终会变得更容易。
WhoCanHelpMe给出了一个如何使用体面的OOP结构和IOC实现Automapper的示例。