asp.net 如何在单个验证控件上实现多个验证组的效果?

agyaoht7  于 2023-08-08  发布在  .NET
关注(0)|答案(2)|浏览(84)

我需要能够将多个验证组应用到我的页面上的一些控件,因为对于三个提交“模式”中的每一个,都有一组不同的必填字段。
我有三个提交按钮,每个按钮都有自己的验证组(拒绝、批准和保存)。“Reject”实际上目前没有任何必填字段,但将来可能会有。“保存”只需要“名”和“姓”,“批准”需要“名”、“姓”和“组名”。
我尝试简单地在属性值中放置多个验证组(如下面的代码所示),但是验证根本没有触发。
我还尝试了根本不指定一个组,试图让验证始终触发,但再次,它根本没有触发。

<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的亲切帮助下,我已经确定,在一个验证控件上不可能有多个验证组,并且需要自定义代码来达到预期的效果。我已经相应地更新了这个问题,以帮助任何希望在未来实现这一目标的人。
我将测试一个包含a.bajorinas和Sunil答案元素的解决方案,并希望能够在之后提供更新。

62lalag4

62lalag41#

我唯一能想到的是你想要的用例,就是在按钮点击后的代码中为你的验证器设置ValidationGroup,请记住,这将首先执行回发,然后验证控件,这可能不适合你。

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

字符串
这将允许您为多个组重用验证器。同样在我的链接张贴,其中一个评论选择的答案是“这是不可能的分配多个组到一个验证控件”

daupos2t

daupos2t2#

NET不支持多个验证组。“但是,只要使用一点JavaScript代码,就可以使它支持多个验证组。您需要做的是覆盖IsValidationGroupMatch的标准JavaScript函数。此函数是ASP.NET中标准验证库的一部分。
在aspx页面的底部,只需添加下面给出的script标记。请注意,此脚本正好在关闭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" />

相关问题