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

Pol*_*ial 5 c# asp.net webmatrix asp.net-webpages webmatrix-2

我正在使用Validation.Add()Html.TextBox()(以及相关的)帮助器与不显眼的 JavaScript 错误检查相结合,并且对结果非常满意。它用一组代码涵盖了服务器和客户端,通常我已经能够实现我需要的一切。

不过,我遇到了一些障碍,因为有时您需要运行自己的逻辑来建立错误情况。如果此错误直接与某个字段相关,那么最好使用任意错误消息手动将该字段标记为错误源 - 我相当确定没有办法立即执行此操作。为了澄清我的意思,一个示例是用户名字段,需要检查用户名是否已在使用中 - 如果是,则会生成错误。

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

我应该从 派生RequestFieldValidatorBase并创建一个仅返回到 的验证器falseIsValid()?显然,作为服务器端检查,我不希望在客户端检查它,尽管我知道通过为验证系统编写更具体的验证器和插件、公开更多data-属性并执行 AJAX也可以实现这一点查看。我对这个问题感兴趣的是一个更通用的解决方案:将特定字段标记为服务器端错误的来源。

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

Dan*_*zzi 3

很抱歉死灵法师的回答,但我最近遇到了这个,并且我找到了一个更简单的解决方案。ModelStateDictionary原生支持此功能。只需使用ModelState而不是Validation,您就不再需要自定义验证器、初始化方法或任何其他工件;一切都在以下位置烘烤:

触发特定表单元素的验证

if (!usernameIsValid)
{
    ModelState.AddError("username", "That username is already taken.");
}
Run Code Online (Sandbox Code Playgroud)

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

触发整个表单的验证

if (password != confirmation)
{
    ModelState.AddFormError("Password and confirmation password do not match.");
}
Run Code Online (Sandbox Code Playgroud)

此方法的另一个优点是ModelState适用于 ASP.NET 网页ASP.NET MVC。另一方面,Validation它是 ASP.NET 网页专有的,如果您希望将项目迁移到 MVC,这可能会使事情变得复杂。

资源