asp.net-mvc - 验证 ASP.NET MVC 中的 ViewModel

标签 asp.net-mvc validation viewmodel

大多数关于如何在 ASP.NET MVC 中实现验证的技巧似乎都围绕着模型(在模型和 Controller 之间构建服务层或使用验证属性装饰模型的属性)。

在我的应用程序中,我使用 ViewModels 进行 Controller 和 View 之间的所有通信。

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

当用户输入他们的电子邮件地址并单击提交时,这个 ViewModel 被填充并发送到 Controller ,在那里验证电子邮件地址。

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

对此添加验证的便捷方法是什么?我应该将验证放在 ViewModel 本身吗?还是应该留在 Controller 中?

最佳答案

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

如果您查看 xVal 之类的工具,您可以看到常规验证(例如,必填字段、范围内的数字、匹配正则表达式的字符串)可以通过装饰数据类的字段来自动完成。事实上,xVal 可以自动编写 JavaScript 进行例行验证,以便在客户端执行。无需编写任何代码。更深入的验证(例如,该用户是否是在我们数据库中注册的域的成员?)发生在模型层本身的服务器端。

使用 ViewModel 惯用语可能会给这个方案带来一些挑战。我目前的方法是将我的实体对象嵌入到我的 View 模型中,例如

public class Contact {
    [Required]
    string Name { get; set; }
}

public class ContactView {
    public Contact Contact { get; set; }
    public string SomeOtherViewProperty { get; set; }
}

然后在 Controller 中,更新模型时发生浅验证:
UpdateModel(contactViewModel.Contact, "Contact");

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

另一种方法是不嵌入实体对象,而只是在两者之间映射各个字段。我最近发现了一个名为 AutoMapper 的工具。它自动链接域和 View 模型对象之间的字段。看起来它应该支持这种验证方法,虽然我还没有使用它。

关于asp.net-mvc - 验证 ASP.NET MVC 中的 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1135320/

相关文章:

asp.net-mvc - ASP.NET MVC ActionLink外部区域

asp.net-mvc - 如何在不将数据上传到云的情况下使用 Power BI Desktop

c# - 为什么这个 Linq Where 子句不过滤结果

validation - 电子邮件地址中显示名称的最大长度是多少

mongodb - Mongoose 验证子文档数组

wpf - 如何将ViewModel应用于页面内的UserControl?

c# - 2 个模型选择字符串

c# - 从 Controller 中获取 Controller 和 Action 名称?

javascript - 防止用户在达到最大长度时输入其他字符

android-fragments - 如何在 Android 的单个片段中使用多个 View 模型?