多个验证组,仅在控制模糊上验证一个

时间:2013-12-02 13:30:08

标签: asp.net validation

摘要

我有一个控件,有两个(几乎)相同的验证器,每个验证器链接到两个验证组。当光标离开控件时,ASP.NET会自动检查两个验证器。有没有办法只触发一个(没有设置EnableClientScript="false"),因此*上没有显示两个blur个符号?

详情

我有一个包含两个按钮asp:btnSaveasp: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}}也出现,导致与之前相同...即两个*符号。

3 个答案:

答案 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)

我也面临这个问题 - 我有:

  • 由不同按钮触发的多个ValidationGroup
  • 需要在两个组中进行的验证(在我的情况下为RequiredFieldValidators)

添加多个验证器的工作原理如上所示,直到您输入然后删除字段为止 - 您将获得两个消息。我的 解决方法 如下:

覆盖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实现。它实际上只是在客户端上工作的解决方法/黑客,每次都需要手动完成对所有重要服务器端验证的额外检查。