摘要
我有一个控件,有两个(几乎)相同的验证器,每个验证器链接到两个验证组。当光标离开控件时,ASP.NET会自动检查两个验证器。有没有办法只触发一个(没有设置EnableClientScript="false"
),因此*
上没有显示两个blur
个符号?
详情
我有一个包含两个按钮asp:btnSave
和asp:btnSubmit
的表单...两个按钮都需要验证,因为某些控件必须在保存时验证才能正常工作。
所以我有两个验证组,用于提交的“默认”组(即未设置ValidationGroup
属性),以及用于保存的“SaveGroup”。有两个asp:ValidationSummary
控件可以反映这些。
在(例如)设计为接受小数值的单个控件上,我有以下内容。首先是提交的必填字段,然后是提交的范围验证器。然后是第三个验证器,它是范围验证器的复制但是“SaveGroup”的一部分......
<asp:TextBox runat="server" id="txtMyDecVal" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtMyDecVal"
Text="*" ErrorMessage="Enter a value" />
<asp:RangeValidator runat="server" ControlToValidate="txtMyDecVal" Type="Double"
MinimumValue="0" MaximumValue="999.99" Text="*"
ErrorMessage="Value must be between 0 and 999.99" />
<asp:RangeValidator runat="server" ControlToValidate="txtMyDecVal" Type="Double"
MinimumValue="0" MaximumValue="999.99" Text="*"
ErrorMessage="Value must be between 0 and 999.99"
ValidationGroup="SaveGroup" />
这样工作正常,两个按钮验证正确。
问题是...... 有一个视觉问题,如果您在控件中键入无效文本,那么当光标离开时,ASP.NET会自动触发RangeValidators
控制,导致出现两个*
符号。
有没有办法让它只有一个验证器作为控件上blur
事件的一部分进行检查?
我可以在其中一个验证器上设置EnableClientScript="false"
,但我仍然希望它在没有回发的情况下检查客户端的控件。
更新
我一直在设置EnableClientScript="false"
,因为我认为保存后的回发实际上并不是一个大问题。
然而,这导致了另一个视觉问题:输入无效文本,“提交”验证器显示*
。单击保存,后退,然后显示“保存”验证器的*
。如果您随后将文本更改为有效文本,则“保存”验证器不会消失,因此看起来仍然存在问题...如果您将文本更改为其他无效文本,则会获得“提交”{{ 1}}也出现,导致与之前相同...即两个*
符号。
答案 0 :(得分:1)
您应该向验证者添加Display="Dynamic"
。
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtMyDecVal"
Text="*" ErrorMessage="Enter a value" Display="Dynamic" />
<asp:RangeValidator runat="server" ControlToValidate="txtMyDecVal" Type="Double"
MinimumValue="0" MaximumValue="999.99" Text="*"
ErrorMessage="Value must be between 0 and 999.99" Display="Dynamic" />
<asp:RangeValidator runat="server" ControlToValidate="txtMyDecVal" Type="Double"
MinimumValue="0" MaximumValue="999.99" Text="*"
ErrorMessage="Value must be between 0 and 999.99"
ValidationGroup="SaveGroup" Display="Dynamic"/>
答案 1 :(得分:0)
由Satheesh babu's artice提供,并且玩弄了几个选项 - 我认为处理复杂情况的最佳方法是DIY。
我已设置CausesValidation="False"
并从按钮中移除ValidationGroup
,并添加如下内容:
OnClientClick="if (EnableVal(['ValidationGroup1','ValidationGroup2']) == false) {return false;}"
用于客户端验证,其中特定按钮在流程前进时验证越来越复杂的规则。这允许我减少重复验证器。
然后,在服务器端,我为每个组调用Page.Validate("ValidationGroup#")
,具体取决于按钮甚至业务流程状态,最后检查Page.IsValid
。
此外,根据业务流程状态,按钮&#39; OnClientClick
可以从代码隐藏中设置,具体取决于我现在要处理的验证组。
最后,要结合验证摘要,请参阅此处的javascript:Page_ClientValidate() with multiple ValidationGroups - how to show multiple summaries simultaneously?(进行一些调整)。
网非常优雅,但可能给予最大的控制权。
答案 2 :(得分:0)
我也面临这个问题 - 我有:
添加多个验证器的工作原理如上所示,直到您输入然后删除字段为止 - 您将获得两个消息。我的 解决方法 如下:
覆盖IsValidationGroupMatch
JavaScript方法以允许ValidationGroup
属性中的逗号分隔值:
function IsValidationGroupMatch(control, validationGroup) {
if ((typeof (validationGroup) == "undefined") || (validationGroup == null)) {
return true;
}
var controlGroup = "";
if (typeof (control.validationGroup) == "string") {
controlGroup = control.validationGroup;
}
//return (controlGroup == validationGroup);
var controlValidationGroups = controlGroup.split(",");
return (controlValidationGroups.indexOf(validationGroup) > -1);
}
然后在ASP中添加:
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
ControlToValidate="TextBox1" ValidationGroup="VG1,VG2" Display="Dynamic">
Text box is required
</asp:RequiredFieldValidator>
<asp:Button ID="Button1" runat="server" Text="Validate VG1"
OnClick="Button1_Click" ValidationGroup="VG1" />
<asp:Button ID="Button2" runat="server" Text="Validate VG2"
OnClick="Button2_Click" ValidationGroup="VG2" />
这适用于客户端,但在服务器上,您需要添加自定义代码行,以确保列出需要由两者验证的控件:
// controls listed as part of ValidationGroup 'VG1' will have had their
// validation tested, ones listed as 'VG1,VG2', 'VG2,VG1' etc would not
protected void Button1_Click(object sender, EventArgs e)
{
Page.Validate("VG1,VG2");
if (!Page.IsValid)
return;
// do something
}
这样,验证控件只需要添加一次,但可以为多个ValidationGroup实现。它实际上只是在客户端上工作的解决方法/黑客,每次都需要手动完成对所有重要服务器端验证的额外检查。