【问题标题】:How can I achieve the effect of multiple validation groups on a single validation control?如何在单个验证控件上实现多个验证组的效果?
【发布时间】:2019-05-27 17:47:59
【问题描述】:

我需要能够将多个验证组应用于我页面上的某些控件,因为对于三种提交“模式”中的每一种,都有一组不同的必填字段。

我有三个提交按钮,每个按钮都有自己的验证组(拒绝、批准和保存)。 “拒绝”目前实际上没有任何必填字段,但将来可能。 “保存”只需要“名字”和“姓氏”,而“批准”需要“名字”、“姓氏”和“组名”。

我尝试简单地将多个验证组放在属性值中(如下面的代码所示),但验证根本没有触发。

我还尝试完全不指定组,试图让验证始终触发,但同样,它根本没有触发。

<div>
    <label for='<%= txt_FirstName.ClientID %>'>First Name</label>
    <asp:TextBox ID="txt_FirstName" runat="server"></asp:TextBox>
    <asp:RequiredFieldValidator ID="rfv_FirstName" runat="server" text="Required"
        ControlToValidate="txt_FirstName" ValidationGroup="approve save">
    </asp:RequiredFieldValidator>
</div>
<div>
    <label for='<%= txt_LastName.ClientID %>'>Last Name</label>
    <asp:TextBox ID="txt_LastName" runat="server"></asp:TextBox>
    <asp:RequiredFieldValidator ID="rfv_LastName" runat="server" text="Required"
        ControlToValidate="txt_LastName" ValidationGroup="approve save">
    </asp:RequiredFieldValidator>
</div>
<div>
    <label for='<%= ddl_GroupName.ClientID %>'>Group Name</label>
    <asp:DropDownList ID="ddl_GroupName" runat="server"></asp:DropDownList>
    <asp:RequiredFieldValidator ID="rfv_GroupName" runat="server" text="Required"
        ControlToValidate="ddl_GroupName" ValidationGroup="approve">
    </asp:RequiredFieldValidator>
</div>
<div>
    <asp:Button ID="btn_Reject" runat="server" Text="Reject"
        ValidationGroup="reject" OnClick="btn_Reject_Click" />
    <asp:Button ID="btn_Approve" runat="server" Text="Approve"
        ValidationGroup="approve" OnClick="btn_Approve_Click" />
    <asp:Button ID="btn_Save" runat="server" Text="Save"
        ValidationGroup="save" OnClick="btn_Save_Click" />
</div>

我确信我可以通过一些额外的代码或为每个验证组复制验证器控件来实现所需的效果,但我希望 webforms 框架有一个更简单的内置方法来做到这一点。

更新(2018-01-02):
问题"Is it possible to assign Multiple Validation Groups to a single Validation Control?" 是我自己的一个特例。它在多个组中有一个控件,而我有多个具有多个重叠组的控件。此外,答案建议为每个输入/组组合设置一个验证控件。这是一个糟糕的解决方案,因为除其他外,它违反了 DRY(不要重复自己)编程原则,并使维护/增强变得更加困难。

上面还链接了问题"How to validate against Multiple validation groups?"。这个问题是一个完全不同的问题(验证组中的验证组),它的答案提出了需要为每个提交按钮、每个需要多个验证组的页面上编写的自定义 javascript。

我正在寻找一个通用案例解决方案,我可以编写/实现一次并应用于整个 Web 应用程序,因此我不认为我的问题是上述问题的重复。

更新(2018-01-03):
在研究我的问题时遇到的其他问题/文章之间,以及 a.bajorinas 和 Sunil 的亲切帮助,我已经确定不可能在验证控件上拥有多个验证组-box,并且需要自定义代码才能达到预期的效果。我已经相应地更新了这个问题,以帮助任何希望在未来实现这一目标的人。

我将测试一个包含 a.bajorinas 和 Sunil 答案中的元素的解决方案,并希望之后能够提供更新。

【问题讨论】:

  • 你可以试试我贴的答案,我已经测试过了。请注意,验证多个组的按钮应具有为validationGroup 属性指定的逗号分隔列表,如ValidationGroup="group1, group2"。此外,应在提交控件级别指定多个验证组,例如为按钮指定,而不是为不提交页面的验证器指定。
  • @a.bajorinas 请参阅我的编辑以解释为什么这不是重复的。

标签: asp.net validation webforms validationgroup


【解决方案1】:

对于您想要的用例,我唯一能想到的就是在单击按钮时在代码后面的代码中为您的验证器设置 ValidationGroup,请记住,这将首先执行回发,然后验证可能不是的控件没关系。

protected void btn_save_click(object sender, EventArgs e){
    rfv_FirstName.ValidationGroup = "save";
    Page.Validate("save");
    if (Page.IsValid)
    {
        //logic if validators pass
    }
}

这将使您可以为多个组重用验证器。 同样在我链接的帖子中,所选答案的 cmets 之一是“无法将多个组分配给验证控件”

【讨论】:

  • 我们确实需要客户端验证以及服务器,但我认为我们将能够根据您和 Sunil 的建议拼凑出一个可重用的解决方案。我可能再过一两个星期都没有时间测试这个,但我很感激你的帮助。
【解决方案2】:

ASP.Net 不支持多个验证组。但是,只需一点 JavaScript 代码,您就可以使其支持多个验证组。 您需要做的是覆盖IsValidationGroupMatch 的标准JavaScript 函数。此函数是 ASP.Net 中标准验证库的一部分。

在您的 aspx 页面底部,只需添加下面给出的脚本标记。请注意,此脚本就在关闭 form、body 和 html 标记之前,这在覆盖 JavaScript 函数时很重要。

<script type="text/javascript">
            window["IsValidationGroupMatch"] = function (control, validationGroup) {
                if ((typeof (validationGroup) == "undefined") || (validationGroup == null)) {
                    return true;
                }
                var controlGroup = "";
                var isGroupContained = false;
                if (typeof (control.validationGroup) == "string") {
                    controlGroup = control.validationGroup;
                    var controlGroupArray = [];
                    if (validationGroup.indexOf(",") > -1) {
                        controlGroupArray = validationGroup.split(",");// validationGroup.split(",");
                    }
                    for (var i = 0; i < controlGroupArray.length; i++) {
                        if (controlGroupArray[i].trim() == controlGroup.trim()) {
                            isGroupContained = true;
                        }
                    }
                }
                return (controlGroup == validationGroup || isGroupContained);
            }
        </script>
    </form>
</body>
</html>

完成此操作后,您可以为验证多个验证组的按钮添加逗号分隔的验证组列表,如下例所示。在下面的示例中,ID 为 btnMultipleValidationGroups 的按钮正在验证 group1 和 group2。

<div>
            TextBox1 : 
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="TextBox1 needs input"  ControlToValidate="TextBox1" ForeColor="Red" ValidationGroup="group1"></asp:RequiredFieldValidator>

            <br />
            <br />
            TextBox2 : 
            <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
            <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ErrorMessage="TextBox2 needs input"  ControlToValidate="TextBox2" ForeColor="Red" ValidationGroup="group2"></asp:RequiredFieldValidator>
            <br />
            <br />
            TextBox3 :
             <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
            <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ErrorMessage="TextBox3 needs input"  ControlToValidate="TextBox3" ForeColor="Red" ValidationGroup="group3"></asp:RequiredFieldValidator>

            <br />
            <br />
        </div>
        <asp:Button ID="btnMultipleValidationGroups" runat="server" Text="Validate group1 and group2" ValidationGroup="group1,group2" OnClick="btnMultipleValidationGroups_Click" />
        <asp:Button ID="btnGroup1" runat="server" Text="Validate only group1" ValidationGroup="group1" OnClick="btnGroup1_Click" />
        <asp:Button ID="btnGroup2" runat="server" Text="Validate only group2" ValidationGroup="group2" OnClick="btnGroup2_Click" />

【讨论】:

  • 正如我所提到的,我希望避免需要编写任何自定义代码来实现此功能,但看起来我可以将您的解决方案应用于整个网站,这可能对未来有用这个项目。
  • 是的,您可以通过将该脚本添加到母版页来将其应用于整个项目。就像我说的,ASP.Net 不支持多个组。另外,请记住,您必须仅在按钮等提交控件上使用多个组,而不能在验证器上使用。
  • 啊,当我第一次查看此解决方案时,我错过了最后一点。我们需要验证器本身拥有多个组,而不是按钮。把它交给微软,让看似简单的任务变得如此复杂。 ;)
  • @Eric,为一个验证器设置多个验证组是没有意义的,因为除了自定义验证器之外的验证器可以绑定到一个且只有一个控件。因此,您不能拥有一个验证两个文本框的RequiredFieldValidator,即它必须只验证一个文本框。由于这个事实,为单个验证器设置多个验证组是没有意义的。
  • 我不需要一个验证器来验证多个控件。当多个可用验证组之一处于活动状态时,我需要一个验证器来验证一个控件。例如,当验证组“group1”或“group2”处于活动状态时需要 TextBox1,但在“group3”处于活动状态时不需要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
相关资源
最近更新 更多