这是一个使用 CustomValidator 的解决方案,需要进行一些组织更改。这需要回发,因为 CustomValidator 验证是在服务器端执行的。
设置如下:
- 对于显示“请为'名称'字段提供文本”消息的每个现有RequiredFieldValidators,您需要设置:
- EnableClientScript="false"
- ValidationGroup="vgTxtName"(提供您自己的姓名)
- ErrorMessage=""(或将其完全删除;现在由 CustomValidator 负责)
您可以选择不显示任何内容(用户不太清楚)或显示星号以指示哪个验证器无效。
选项 1:
选项 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 类型。如果您打算使用其他验证器类型,则需要设置不同的分组或调整代码。