asp.net-mvc – 在ASP.NET MVC中对ViewModels进行验证

关于如何在ASP.NET MVC中实现验证的大多数提示似乎围绕着Model(在模型和控制器之间构建服务层或者用验证属性来装饰模型的属性)。

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

我有一个名为“Loginviewmodel”的登录页面viewmodel,其名称为“EmailAddress”。

用户输入他们的电子邮件地址并点击提交时,此viewmodel将被填充并发送到控制器,该电子邮件地址已被验证。

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

什么是一种方便的方法添加验证?我应该将验证放在viewmodel本身吗?还是应该留在控制器?

解决方法

“我应该将验证放在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的工具,它自动链接域和视图模型对象之间的字段。它似乎应该支持这种验证方法,虽然我还没有使用它。

相关文章

这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识...
Some samples are below for ASP.Net web form controls:(fr...
问题描述: 对于未定义为 System.String 的列,唯一有效的值...
最近用到了CalendarExtender,结果不知道为什么发生了错位,...
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence cha...