首页 > 解决方案 > 如何在单个验证控件上实现多个验证组的效果?

问题描述

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

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

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

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

<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):
问题“是否可以将多个验证组分配给单个验证控件?” 是我自己的一个特例。它在多个组中有一个控件,而我有多个具有多个重叠组的控件。此外,答案建议为每个输入/组组合设置一个验证控件。这是一个糟糕的解决方案,因为除其他外,它违反了 DRY(不要重复自己)编程原则,并使维护/增强更加困难。

以上还链接了“如何针对多个验证组进行验证?”的问题。. 这个问题是一个完全不同的问题(验证组中的验证组),它的答案提出了需要为每个提交按钮编写的自定义 javascript,在需要多个验证组的每个页面上。

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

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

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

标签: asp.netvalidationwebformsvalidationgroup

解决方案


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

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

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


推荐阅读