【问题标题】:Manually trigger validation on a specific form element手动触发对特定表单元素的验证
【发布时间】:2013-11-06 12:47:31
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# asp.net webmatrix asp.net-webpages webmatrix-2


    【解决方案1】:

    很抱歉死灵法师的回答,但我最近碰到了这个,我找到了一个更简单的解决方案。 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 中工作。另一方面,Validation 是 ASP.NET 网页专有的,如果您希望将项目迁移到 MVC,这可能会使事情变得复杂。

    资源

    【讨论】:

      【解决方案2】:

      我想我会回来并发布我最终实现的内容,以防它可能对其他人有所帮助或以防任何人提出任何改进建议。

      我添加了一个自定义验证器,我将其命名为 ThrowApp_Code

      public class Throw : RequestFieldValidatorBase
      {
          public Throw(string errorMessage)
              : base(errorMessage)
          { }
      
          protected override bool IsValid(System.Web.HttpContextBase httpContext, string value)
          {
              return false;
          }
      }
      

      然后为它添加了一个初始化方法,这样我就可以以与内置验证器相同的方式创建它们的内联实例(也添加到App_Code):

      public static class CustomValidator
      {
          public static Throw Throw(string errorMessage)
          {
              return new Throw(errorMessage);
          }
      }
      

      然后在我的内容页面中,我可以执行以下操作:

      if (!usernameIsValid)
      {
          Validation.Add("username", CustomValidator.Throw("That username is already taken."));
      }
      

      【讨论】:

        猜你喜欢
        • 2011-04-21
        • 2011-11-24
        • 1970-01-01
        • 2023-04-02
        • 2016-08-06
        • 1970-01-01
        • 1970-01-01
        • 2020-02-29
        相关资源
        最近更新 更多