【问题标题】:asp.net - gridview validation - repeating validation messages issueasp.net - gridview 验证 - 重复验证消息问题
【发布时间】:2010-09-30 03:12:48
【问题描述】:

我有一个包含一对多行的gridview(就像大多数人一样) - 每个都有一个输入文本框。每行都有一个针对该文本框的 requiredfieldvalidator。提交表单时,gridview 被验证,完全有可能不止一行有一个空的文本框。这会导致重复验证消息,例如

  • 请为“姓名”字段提供文本
  • 请为“姓名”字段提供文本
  • 请为“姓名”字段提供文本

是否可以将这些消息合并为一条消息?

我知道可以通过设置验证器类并从可用于验证整个网格视图的 BaseValidator 类继承来创建验证器。但是当图像无效时,我会在每一行上放置一个图像,所以我应该想象我需要在每一行上使用单独的验证器。

【问题讨论】:

    标签: asp.net gridview validation


    【解决方案1】:

    这是一个使用 CustomValidator 的解决方案,需要进行一些组织更改。这需要回发,因为 CustomValidator 验证是在服务器端执行的。

    设置如下:

    1. 对于显示“请为'名称'字段提供文本”消息的每个现有RequiredFieldValidators,您需要设置:
    • EnableClientScript="false"
    • ValidationGroup="vgTxtName"(提供您自己的姓名)
    • ErrorMessage=""(或将其完全删除;现在由 CustomValidator 负责)
    您可以选择不显示任何内容(用户不太清楚)或显示星号以指示哪个验证器无效。
    选项 1:
    • Display="无"
    选项 2(首选):
    • Display="动态"
    • 将验证器标签之间的文本设置为:*
  • 您的 ValidationSummary 控件无需更改(它应该是中性的,并且没有设置 ValidationGroup 属性,这是默认设置)
  • 添加一个 CustomValidator(参见下面的代码)
    • 为 CustomValidator 的 ServerValidate 事件添加一个事件处理程序(您可以在设计器中双击它来生成它)
    • 实现事件处理逻辑(见下面的代码)

    我们的想法是不再直接允许页面处理那些RequiredFieldValidator,而是让CustomValidator来做。

    TextBoxRequiredFieldValidator 示例(您应该拥有与上述步骤 1 对应的相关 ID 名称的类似内容):

    选项 1:

    <asp:RequiredFieldValidator ControlToValidate="txt1" ID="rfv1" runat="server" 
    EnableClientScript="false" Display="None" ValidationGroup="vgTxtName" />
    

    选项 2:

    <asp:RequiredFieldValidator ControlToValidate="txt1" ID="rfv1" runat="server" 
    EnableClientScript="false" Display="Dynamic" ValidationGroup="vgTxtName">*
    </asp:RequiredFieldValidator>
    

    CustomValidator 标记(您可以将其放置在任何合理的位置,例如 ValidationSummary 控件旁边):

    <asp:CustomValidator ID="cvName" runat="server" Display="None"
    ErrorMessage="Please provide text for 'Name' field" 
    OnServerValidate="cvName_ServerValidate" />
    

    此处的错误消息替换了来自各个验证器的错误消息。另请注意,没有 ControlToValidate 集,它对这种类型的验证器有效,并且对于应用覆盖多个控件的验证很有用。

    CustomValidator EventHandler (cvName_ServerValidate):

    protected void cvName_ServerValidate(object source, ServerValidateEventArgs args)
    {
        // Validate vgTxtName group
        Page.Validate("vgTxtName");
    
        // .NET 3.5 - add using System.Linq;
        args.IsValid = Page.GetValidators("vgTxtName")
                            .OfType<RequiredFieldValidator>()
                            .All(v => v.IsValid);
    
        // .NET 2.0 (use either this or the above, not both)
        bool isValid = true;
        foreach (RequiredFieldValidator validator in Page.GetValidators("vgTxtName"))
        {
            isValid &= validator.IsValid;
        }
        args.IsValid = isValid;
    }
    

    就是这样!请记住,这仅适用于RequiredFieldValidators。您不应该将不同类型的验证器放在“vgTxtName”组中,因为 cvName 逻辑严格处理RequiredFieldValidator 类型。如果您打算使用其他验证器类型,则需要设置不同的分组或调整代码。

    【讨论】:

      【解决方案2】:

      我建议不要使用验证器摘要。

      将验证器的 Text 属性或内部内容更改为更适合您的应用程序的内容。

      例如...

      <asp:Validator ID="X" ... runAt="server" Text="*" />
      

      <asp:Validator ID="X" ... runAt="server">*</asp:Validator>
      

      或显示图像...

      <asp:Validator ID="X" ... runAt="server"><img src="../path.png" alt="Invalid" /></asp:Validator>
      

      我还将验证器设置为指向帮助光标的指针,并添加一个 ToolTip 属性以显示相同的错误消息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-08
        • 1970-01-01
        • 1970-01-01
        • 2015-08-09
        • 2015-02-14
        相关资源
        最近更新 更多