“我应该将验证放在 ViewModel 本身中吗?还是应该留在控制器中”我同意罗伯特的观点,但我会添加一个插件以实现额外的自动化。
如果您查看诸如xVal 之类的工具,您会发现常规验证(例如,必填字段、范围内的数字、匹配正则表达式的字符串)可以通过修饰数据类的字段来自动完成。事实上,xVal 可以自动编写 JavaScript 进行例行验证,以便在客户端执行。无需编写任何代码。更深入的验证(例如,该用户是否是在我们数据库中注册的域的成员?)发生在模型层本身的服务器端。
使用 ViewModel 惯用语可能会给这个方案带来一些挑战。我目前的方法是将我的实体对象嵌入到我的视图模型中,例如
public class Contact {
[Required]
string Name { get; set; }
}
public class ContactView {
public Contact Contact { get; set; }
public string SomeOtherViewProperty { get; set; }
}
然后在控制器中,更新模型时发生浅验证:
UpdateModel(contactViewModel.Contact, "Contact");
需要更多信息或更复杂计算的验证发生在模型层本身内部。
另一种方法是不嵌入实体对象,而只是在两者之间映射各个字段。我最近知道了一个名为AutoMapper的工具,它可以自动链接域和视图模型对象之间的字段。看起来它应该支持这种验证方法,虽然我还没有使用它。