2009-01-07 65 views
1

我有一个gridview包含一行到多行(像大多数做) - 每个都有一个输入文本框。每行都有一个针对该文本框的requiredfieldvalidator。当表单被提交时,gridview被验证完全有可能多于一行有一个空的文本框。这导致重复验证消息,例如asp.net - gridview验证 - 重复验证消息问题

  • 请提供“名称”字段中的文本
  • 请提供“名称”字段中的文本
  • 请提供“名称”字段中的文本

是否有可能巩固这些邮件进入一条消息?

我知道可以通过设置验证器类并继承BaseValidator类来创建验证器,BaseValidator类可以用来验证gridview整体。但是,当它无效时,我会在每一行放置一张图片,因此我应该想象我需要在每一行上分别使用验证器。

回答

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

2

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

这里的设置:

  1. 对于每个显示“请提供‘姓名’字段文本”的消息现有RequiredFieldValidators,你将需要设置:
    • EnableClientScript =”假“
    • ValidationGroup =”vgTxtName“(提供您自己的名称)
    • ErrorMessage =”“(或者将其完全移除; CustomValidator现在将响应ible for this)
    您可以选择不显示任何内容(对用户不太清楚)或显示星号以指示哪个验证器无效。
    选项1:
    • 显示= “无”
    选项2(优选的):
    • 显示= “动态”
    • 设置文本在验证标签之间:*
  2. 您的ValidationSummary控件无需进行任何更改(它应该是中性的,并且没有设置ValidationGroup属性,这是默认设置)
  3. 添加的CustomValidator(参见下面的代码)
    • 添加事件处理程序为的CustomValidator的的ServerValidate事件(你可以增加一倍,从设计师单击它有它产生的)
    • 实现的事件处理程序逻辑(见下面的代码)

的想法是不是直接让页面再处理那些RequiredFieldValidators相反,我们将让的CustomValidator做到这一点。

文本框的RequiredFieldValidator例如(你应该有一些看起来像这样有关的ID名称对应上面的步骤1):

选项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事件处理(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类型。如果您打算使用其他验证器类型,则需要设置不同的分组或调整代码。