使用ASP.NET MVC 5,如何将服务器端业务规则和逻辑与客户端基本验证混合使用?具体来说,使用@ Html.ValidationMessageFor()?
这是一个常见的场景;想象一下用户名+密码的登录表单。用户名必须是电子邮件地址,当然是必需的。因此,您在用户名字段中有一个带有[Required]和[EmailAddress]数据注释的模型,但是当您将表单提交给控制器时,您会检查该电子邮件地址是否是在您的站点上注册的有效用户/电子邮件地址。如果不是,您可以执行以下操作:
ModelState.AddModelError( "Username", "This username isn't registered at this site.")
不幸的是,当返回到视图时,客户端不显眼的验证会发现您的字段中包含有效的电子邮件地址,因此它会在页面加载时删除您的自定义服务器端提供的错误! (显然MS的jquery validate实现会对页面加载进行自动验证。)
这似乎与一个非常常见的额外服务器端验证规则的情况产生冲突......并且由于客户端设计要求,我们不能简单地将消息放入ValidationSummary中 - 所以请不要建议那。我们需要在字段本身下方显示消息,其他正常的“必需”和“必须是电子邮件地址”验证消息会出现。
最后,这只是业务逻辑验证规则的一个示例;还有更多 - 自定义验证数据属性同样不是所有内容的有效选项,也不是remove(ajax)验证!
似乎是一个相当重要的疏忽?