我有一个名为Customer的业务模型,它具有许多必需的属性(通过DataAnnotations)和其他验证规则。何时使用ViewModel而不是Model?
我有一个视图,旨在允许编辑客户的地址字段。
我遇到的问题是我想要一个强类型的视图,但我不能在这里使用Customer类型。由于该视图只会编辑地址数据,因此它不会返回Customer对象为验证而需要的其他所需数据。
这表明我应该使用ViewModel。但是,有很多业务规则适用于客户的地址相关属性,我必须在新的ViewModel上重复(地址长度,邮编码,州格式等)。他们需要重复,因为客户端验证(我使用xVal)需要该信息才能正常工作。
我觉得我已经达到了catch-22场景。 DRY告诉我,我不应该在我的Model已经拥有的ViewModel上复制业务规则,但另一方面,我不能使用该模型,因为它永远不会验证。
这种情况下的最佳做法是什么?
所选择的路径
我最终选择是视图模型路径的解决方案。为了得到我需要的验证,没有其他实用的方法。
但是,使用ViewModel所带来的是无法消除一些粗糙的地方。我重构了一些模型,以使用包含我知道在ViewModels中重用的属性的接口。由于现在的ViewModels可以使用相同的接口作为模型它让我做这样的事情:
public ActionResult Edit(AddressViewModel address)
{
if(!ModelState.IsValid)
return View();
var customer = Customer.Load(address.CustomerId);
UpdateModel<IAddress>(customer);
// more stuff ....
}
这为我节省了使用automapper的步骤。
我在下面选择的答案(由Wyatt Barnett提供)我觉得在大多数情况下都很好,我在其他项目上使用它,对Linq-to-Sql特别有用。
你有没有找到一个优雅的解决方案呢? – 2009-08-18 09:33:27
@Andrew - 我用我的解决方案更新了我的问题。不是一条完美的路线,而是我能想到的最好的路线。 – 2009-08-18 14:49:07