这是一个使用CustomValidator并需要进行一些组织更改的解决方案。这需要回发,因为CustomValidator验证在服务器端执行。
这里的设置:
- 对于每个显示“请提供‘姓名’字段文本”的消息现有RequiredFieldValidators,你将需要设置:
- EnableClientScript =”假“
- ValidationGroup =”vgTxtName“(提供您自己的名称)
- ErrorMessage =”“(或者将其完全移除; CustomValidator现在将响应ible for this)
您可以选择不显示任何内容(对用户不太清楚)或显示星号以指示哪个验证器无效。
选项1:
选项2(优选的):
- 您的ValidationSummary控件无需进行任何更改(它应该是中性的,并且没有设置ValidationGroup属性,这是默认设置)
- 添加的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类型。如果您打算使用其他验证器类型,则需要设置不同的分组或调整代码。