【问题标题】:On postback, how can I add a error message to validation summary?在回发时,如何向验证摘要添加错误消息?
【发布时间】:2010-10-21 03:27:22
【问题描述】:

两个问题:

在用户单击提交时的回发时,如何在验证摘要中添加错误消息?

是否也可以使用内置的 .net 验证控件突出显示特定的文本框?

【问题讨论】:

    标签: asp.net validation


    【解决方案1】:

    动态创建一个 CustomValidator 控件并将其直接添加到 Page.Validators 集合中。

    Dim err As New CustomValidator
    err.ValidationGroup = "MyGroup"
    err.IsValid = False
    err.ErrorMessage = "The password is invalid"
    Page.Validators.Add(err)
    

    与将 CustomValidator 添加到标记不同,此方法允许您根据服务器端业务逻辑添加任意数量的任意错误消息。

    请注意,您也可以直接将其添加到页面中,但需要遵循一些规则:

    1. 您必须将该控件添加到与验证组的控件相同的命名容器中。
    2. 如果您不希望验证消息出现在页面中的随机位置,则必须将验证器添加到特定容器,或者需要使用 CSS 类或样式来抑制它。李>

    您也可以创建custom class and implement IValidator,这样您就可以使用一行代码添加消息,但此方法不支持验证组。

    根据 Anders Fjeldstad 的建议,这里有一组方便的扩展方法。

    Imports Microsoft.VisualBasic
    Imports System.Runtime.CompilerServices
    
    Public Module PageExtensions
    
        <Extension()> _
        Public Sub AddValidationError(ByVal p As System.Web.UI.Page, ByVal errorMessage As String)
            p.AddValidationError(errorMessage, String.Empty)
        End Sub
    
        <Extension()> _
        Public Sub AddValidationError(ByVal p As System.Web.UI.Page, ByVal errorMessage As String, ByVal validationGroup As String)
            Dim err As New CustomValidator
            err.ValidationGroup = validationGroup
            err.ErrorMessage = errorMessage
            err.IsValid = False
            p.Validators.Add(err)
        End Sub
    
    End Module
    

    【讨论】:

    • +1 用于启用任意数量的错误消息。另外,上面的代码可以很容易地分解为 System.Web.UI.Page 或 System.Web.UI.ValidatorCollection 的扩展方法,这将允许通过 Page.AddValiationError("MyValidationGroup", "Some error消息")
    • 我发现一旦我以这种方式添加了验证器(并将它们添加到页面上的控件中,这样我就可以控制它们出现的位置),如果我没有设置 ControlToValidate属性然后我无法更改使页面无效的东西 - 所以我无法再次提交页面。设置该属性为我修复了它。
    • 非常有用@NightOwl888。只是为了方便相同的代码,但在 C# CustomValidator err = new CustomValidator(); err.ValidationGroup = "MyGroup"; err.IsValid = false; err.ErrorMessage = "The Password is Invalid"; Page.Validators.Add(err);
    • 我建议考虑 ValidationGrouo 属性。这可能是 ValidationSummary 的扩展方法,无需传递页面
    • 这对我帮助很大,而且很容易理解。谢谢
    【解决方案2】:

    这是上述答案的一个版本,它是 ValidationSummary 的扩展方法,它负责验证组 ID。

    public static void AddCustomMessage(this ValidationSummary summaryControl, string message)
    {
        summaryControl.Page.Validators.Add(new CustomValidator {
            ValidationGroup = summaryControl.ValidationGroup,
            ErrorMessage = message,
            IsValid = false
        });
    }
    
    

    【讨论】:

      【解决方案3】:

      添加一个自定义验证器并手动设置它的IsValidErrorMessage 属性。有点像这样:

      <asp:panel ID="ErrorsPanel" runat="server" CssClass="ErrorSummary">
          <asp:CustomValidator id="CustomValidator1" runat="server" 
              Display="None" EnableClientScript="False"></asp:CustomValidator>
          <asp:ValidationSummary id="ErrorSummary" runat="server" 
              HeaderText="Errors occurred:"></asp:ValidationSummary>
      </asp:panel>
      

      在后面的代码中:

      //
      // Update the database with the changes
      //
      string ErrorDetails;
      if (!Db.Update(out ErrorDetails))
      {
          CustomValidator1.IsValid = false;
          CustomValidator1.ErrorMessage = ErrorDetails;
      }
      

      【讨论】:

      • 这里的一个陷阱是,如果您的验证摘要控件指定了一个 ValidationGroup,那么您还需要向您的 CustomValidator 添加一个 ValidationGroup 属性,以确保在需要的时间/地点显示错误消息。也许只是常识,但它偶尔会引起我的注意。
      【解决方案4】:

      以下是对 NightOwl888 好主意的一点扩展:

      public class ValidationError : CustomValidator
      {
          public ValidationError(string group, string msg)
              : base()
          {
              base.ValidationGroup = group;
              base.ErrorMessage = msg;
              base.IsValid = false;
          }
      }
      
      public static class PageExtensions
      {
          public static void ErrorMessage(this Page page, string group, string msg)
          {
              page.Validators.Add(new ValidationError(group, msg));
          }
      }
      

      每当您想发出错误消息时,只需致电Page.ErrorMessage;机制和他建议的一样。

      【讨论】:

      • 也许让group 成为可选的,所以如果 ValidationSummary 没有定义一个,ValidationError 仍然可以使用它。
      • @DanielBallinger 确定...?请注意,我的代码示例并非旨在成为生产代码,只是为了说明可以实现的东西 - 毕竟,我不是来做其他人的工作作为慈善服务...
      • 对不起,我应该更清楚。我不打算让您更新示例或任何内容。更多地作为其他人在实际实施时考虑的注释。希望为他们节省几分钟的精力。
      【解决方案5】:

      您需要做的就是创建一个自定义验证器并将其添加到页面的验证器集合中,只要出现这样做的条件。

      CustomValidator cv = new CustomValidator();
      
      if(condition)
      {
      cv.IsValid = false;
      cv.ErrorMessage = "This Catalog Data already exists.";
      cv.ValidationGroup = "InputList";
      this.Page.Validators.Add(cv);
      }
      

      注意:不要忘记指定 ValidationGroup,否则即使将自定义验证器添加到您的页面,也不会显示错误消息。而且,如果您确实得到了第二个问题的答案(突出显示文本框),请发布!

      【讨论】:

        【解决方案6】:

        要在验证摘要上添加错误消息,您可以使用 ValidationSummary 的 EnableClientScript 属性和其他验证控件。将 EnableClientScript 全部设置为 false :

        <asp:ValidationSummary
        HeaderText="You must enter a value in the following fields :"
        DisplayMode="BulletList"
        EnableClientScript="false"
        runat="server"/>
        

        对于突出显示控件,不,当前控件无法实现。

        但我将验证控件放在相关控件附近,并将它们的 Text 属性设置为“*”。然后如果验证失败,它就会显示在失败的控件附近。

        也许您可以使用自定义验证器来突出显示失败的控件。但你应该编写自己的实现。

        【讨论】:

          猜你喜欢
          • 2011-08-20
          • 2011-10-03
          • 2010-11-28
          • 2018-05-15
          • 2015-03-03
          • 2022-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多