asp.net - gridview验证 - 重复验证消息问题

时间:2009-01-07 20:33:41

标签: asp.net gridview validation

我有一个包含一到多行的网格视图(比如大多数行) - 每个都有一个输入文本框。每行都有一个针对该文本框的requiredfieldvalidator。提交表单时,验证gridview,完全有可能多个行有一个空文本框。这导致重复验证消息,例如

  • 请提供“姓名”字段
  • 的文字
  • 请提供“姓名”字段
  • 的文字
  • 请提供“姓名”字段
  • 的文字

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

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

2 个答案:

答案 0 :(得分:2)

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

以下是设置:

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

    我们的想法是不再直接允许页面处理那些RequiredFieldValidators,而是让CustomValidator执行此操作。

    TextBox RequiredFieldValidator示例(您应该看到具有与上述步骤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类型。如果您打算使用其他验证器类型,则需要设置不同的分组或调整代码。

答案 1 :(得分:0)

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

将验证器的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属性以显示相同的错误消息。