ASP.NET MVC 中 ViewModel 的验证

2024-04-17

大多数关于如何在 ASP.NET MVC 中实现验证的技巧似乎都以模型为中心(在模型和控制器之间构建服务层,或者使用验证属性装饰模型的属性)。

在我的应用程序中,我使用 ViewModel 进行控制器和视图之间的所有通信。

我的登录页面有一个名为“LoginViewModel”的 ViewModel,其属性名为“EmailAddress”。

当用户输入他们的电子邮件地址并单击“提交”时,此 ViewModel 将被填充并发送到控制器,在控制器中验证电子邮件地址。

它必须是有效的电子邮件地址,并且用户必须来自在系统中注册的域。

对此添加验证的便捷方法是什么?我应该将验证放在 ViewModel 本身中吗?或者它应该留在控制器中?


“我应该将验证放在 ViewModel 本身中吗?还是应该保留在控制器中”我同意 Robert 的观点,但我会添加一个插件以实现额外的自动化。

如果您查看诸如xVal http://blog.codeville.net/2009/01/10/xval-a-validation-framework-for-aspnet-mvc/,您可以看到例行验证(例如,必填字段、范围内的数字、匹配正则表达式的字符串)可以通过装饰数据类的字段来自动完成。事实上,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");

需要更多信息或更复杂计算的验证发生在模型层本身内部。

另一种方法是不嵌入实体对象,而只是映射两者之间的各个字段。我最近意识到一个叫做自动映射器 http://automapper.codeplex.com/它自动链接域和视图模型对象之间的字段。看起来应该支持这种验证方法,虽然我还没有使用过。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET MVC 中 ViewModel 的验证 的相关文章

随机推荐