c# – 手动触发特定表单元素的验证

我正在使用Validation.Add()和
Html.TextBox()(以及相关的)帮助程序以及不引人注目的
JavaScript错误检查,我对结果非常满意.它用一组代码覆盖服务器和客户端,通常我已经能够实现我需要的一切.

虽然因为某些时候你需要运行自己的逻辑来建立一个错误案例,但我遇到了一些麻烦.如果这个错误直接与一个字段有关,那么用一个任意的错误信息手动标记该字段作为错误的来源会很好 – 我很确定没有办法开箱即用.为了澄清我的意思,一个示例是用户名的字段,需要检查用户名是否已被使用 – 如果是,则生成错误.

目前,我正在使用Validation.AddFormError()将其添加到表单错误集合中,该工作正常,但仅在摘要中显示错误.在上面的例子中,错误显然与Username字段有关,能够将该错误与相应的字段名称联系起来(并在正确的位置显示)似乎是合乎逻辑的.

我应该从RequestFieldValidatorBase派生并创建一个只返回false到IsValid()的验证器吗?显然,作为服务器端检查我不希望在客户端检查它,虽然我知道通过为验证系统编写更具体的验证器和插件,暴露更多数据属性和执行也是可能的一个AJAX检查.我对这个问题感兴趣的是一个更通用的解决方案:将特定字段标记为服务器端错误的来源.

希望这是有道理的.人们会建议什么作为解决这个问题的最佳方法?

最佳答案 对不起死灵法师的答案,但我最近碰到了这个,我找到了一个更简单的解决方案. ModelStateDictionary本机支持此功能.只需使用ModelState而不是Validation,您就不再需要自定义验证器,初始化方法或任何其他工件;一切都在烘烤:

对特定表单元素的触发器验证

if (!usernameIsValid)
{
    ModelState.AddError("username", "That username is already taken.");
}

ModelState还允许您添加表单范围的验证错误消息,就像验证一样:

整个表单上的触发器验证

if (password != confirmation)
{
    ModelState.AddFormError("Password and confirmation password do not match.");
}

此方法的另一个优点是ModelState可以在ASP.NET网页和ASP.NET MVC中工作.另一方面,验证是ASP.NET Web Pages专有的,如果您希望将项目迁移到MVC,这可能会使事情变得复杂.

资源

> ASP.NET Web Pages (Razor) API Quick Reference.
> ModelStateDictionary Methods

点赞