11

我有 3 种类型的验证器:

  1. 它是“VG1”验证组的一部分

  2. 它是“VG2”验证组的一部分

  3. 它不属于任何验证组

我有两个按钮,B1 和 B2。

当且仅当第一种和第三种类型的所有验证器都成功验证了与它们关联的控件时,我想验证 B1.Click。

当且仅当第二种和第三种类型的所有验证器都成功验证了与它们关联的控件时,我想验证 B2.Click。

这在 ASP.NET 中可行吗?如果是这样,你能告诉我我该怎么做,或者我在哪里可以读到一些可以在这个问题上启发我的东西?

编辑:

    function isValidButton1()
    {
        var VG1 = Page_ClientValidate("VG1");
        var empty = Page_ClientValidate("");
        return VG1 && empty;
    }

这很好用,但是,如果 VG1 无效,则消息将消失,因为验证了空组。是否有显示所有验证错误消息的解决方案?谢谢你。

编辑2:

    function isValidSaveAsClosed()
    {
        Page_ClientValidate("");
        Page_ClientValidate("VG1");
        var groups = [];
        groups[0] = undefined;
        groups[1] = "VG1";
        var valid = true;
        for (var f in Page_Validators)
        {
            if (jQuery.inArray(Page_Validators[f].validationGroup, groups) >= 0)
            {
                ValidatorValidate(Page_Validators[f]);
                valid = valid && Page_Validators[f].isvalid;
            }
        }

        return valid;
    }

上面的功能解决了我的问题。

4

6 回答 6

13
<asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="return Validate()" />

<script type="text/javascript">
    function Validate() 
    {
        var isValid = false;
        isValid = Page_ClientValidate('VG1');
        if (isValid) 
        {
            isValid = Page_ClientValidate('VG2');
        }

        return isValid;
    }
</script>

试试这个....希望它会有所帮助

于 2012-10-23T07:32:24.133 回答
5

是的,一个按钮可以验证多个验证组。

在 button_click 内,您可以将组验证为

    Page.Validate("VG1");
    Page.Validate("VG2");

    if (Page.IsValid)
    {

         // Page is valid  so proceed..!!

    }
于 2012-10-23T07:31:18.850 回答
5

我正在添加另一个答案,因为添加到我最后一个现有答案会使答案太大,任何人都无法阅读。

在这个答案中,我已经扩展了我的最后一个答案,因此automatically在客户端和服务器端都连接了多个验证组。这意味着您不需要Page_ClientValidate("group1,group2")在 JavaScript 中调用按钮的 onclick 事件,因为它会自动发生。此外,多个组的服务器端验证将自动发生。

下面给出了标记和代码隐藏。您可以尝试我提供的 aspx 代码并在网站项目中对其进行测试。要测试是否发生自动服务器端验证,您必须EnableClientScript="false"为三个验证器中的每一个进行设置。

多组自动验证方法说明

如果要实现多个验证组,则需要在您的 aspx 页面中完成以下步骤。ValidationGroup如果您需要一次验证多个组,请确保在您的标记中提及按钮控件属性的逗号分隔的验证组列表。

  1. 您需要IsValidationGroupMatch通过将 JavaScript 添加到您的 aspx 页面末尾来覆盖 JavaScript 方法(此覆盖的代码在下面的标记代码末尾给出,您可以将其复制/粘贴到您的 aspx 页面中);这是 ASP.Net 验证框架提供的标准方法。
  2. 您需要将按钮与多个验证组连接以进行客户端验证,因为这不是由 ASP.Net 自动完成的;为此,您必须为HookupValidationForMultipleValidationGroups具有多个验证组的每个按钮在 Page_Load 事件的代码隐藏中调用该方法。(您可以将第二个代码片段中给出的此方法复制/粘贴到您的 aspx 页面的代码隐藏中)
  3. 您需要覆盖服务器端方法Validate以添加多个验证组的功能,因为 ASP.Net 中缺少此功能。(您可以将第二个代码片段中给出的此方法复制/粘贴到您的 aspx 页面的代码隐藏中)

带有多个验证组的 aspx 标记

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MultipleValidationGroupsByOneButton.aspx.cs" Inherits="MultipleValidationGroupsByOneButton" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>

</head>
<body>
    <form id="form1" runat="server">
        <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:Label ID="lblMessage" runat="server" ForeColor="Red" Font-Bold="true"></asp:Label>
        <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>

上述aspx页面的代码隐藏

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class MultipleValidationGroupsByOneButton : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //always call this method in Page Load event for each button with multiple validation groups
        HookupValidationForMultipleValidationGroups(btnMultipleValidationGroups);
    }
    //the method below will automatically hook up a button with multiple validation groups for client-side validation
    private void HookupValidationForMultipleValidationGroups(IButtonControl button)
    {
     if (!Page.IsPostBack && button.ValidationGroup.Contains(","))
     {
        //hook up validation on client-side by emitting the appropriate javascript for onclick  event of the button with multiple validation groups
        PostBackOptions myPostBackOptions = new PostBackOptions((WebControl)button);
        myPostBackOptions.ActionUrl = string.Empty;
        myPostBackOptions.AutoPostBack = false;
        myPostBackOptions.RequiresJavaScriptProtocol = true;
        myPostBackOptions.PerformValidation = true;//THIS true value hooks up the client-side validation
        myPostBackOptions.ClientSubmit = true;
        myPostBackOptions.ValidationGroup = button.ValidationGroup;

        // Add postback script so cleint-side validation is automatically hooked up for control with multiple validation groups
        ((WebControl)button).Attributes.Add("onclick", Page.ClientScript.GetPostBackEventReference(myPostBackOptions));
     }
    }
    //Override default Validate method so server-side validation of buttons with multiple validation groups occurs automatically 
    public override void Validate(string validationGroup)
    {
        if (validationGroup.Contains(","))
        {
            string[] validationGroups = validationGroup.Split(",".ToCharArray());
            foreach (string group in validationGroups)
            {
                Page.Validate(group);
            }
        }
        base.Validate(validationGroup);
    }
    protected void btnMultipleValidationGroups_Click(object sender, EventArgs e)
    {
        if (Page.IsValid)
        {
            lblMessage.Text = "Button with multiple validation groups was clicked";
        }
    }
    protected void btnGroup1_Click(object sender, EventArgs e)
    {
        if (Page.IsValid)
        {
            lblMessage.Text = "Button with Group1 validation group was clicked";
        }
    }
    protected void btnGroup2_Click(object sender, EventArgs e)
    {
        if (Page.IsValid)
        {
            lblMessage.Text = "Button with Group2 validation group was clicked";
        }
    }

}
于 2016-06-06T16:56:46.787 回答
4

不涉及编写任何额外代码的更简单的方法是在需要的地方简单地复制验证器,如下面的示例所示:

<div>
    <asp:TextBox ID="txt1" runat="server" placeholder="field1" />
    <asp:RequiredFieldValidator runat="server" ID="req1a" ControlToValidate="txt1" ValidationGroup="group1" Display="Dynamic" />
    <asp:RequiredFieldValidator runat="server" ID="req1b" ControlToValidate="txt1" Display="Dynamic" />
</div>
<div>
    <asp:TextBox ID="txt2" runat="server" placeholder="field2" />
    <asp:RequiredFieldValidator runat="server" ID="req2" ControlToValidate="txt2" />
</div>
<!-- Validate validators with empty ValidationGroup -->
<asp:Button runat="server" ID="btn1" Text="Validate All" />
<!-- Validate group1 validators -->
<asp:Button runat="server" ID="btb2" Text="Validate Group 1" ValidationGroup="group1"/>

第一个按钮将验证两个文本框,即使它们位于不同的组中,而第二个按钮将仅验证第一个文本框。

于 2018-06-09T12:13:40.850 回答
1

您可以使用Page_ClientValidate(validationgroup)函数来验证验证组。

function Validate(vgroup) {
     return Page_ClientValidate(vgroup);
}

你可以试试

<asp:Button ID="B1" runat="server" Text="Button" 
     OnClientClick="return Validate('VG1') && Validate() " />

<asp:Button ID="B2" runat="server" Text="Button" 
     OnClientClick="return Validate('VG2') && Validate() " />
于 2012-10-23T07:32:47.613 回答
1

这是一篇旧帖子,但我最近遇到了同样的问题,我解决它的方法如下所述。

您可以将本文中给出的代码复制到您的 ASP.Net 网站项目中并自己进行测试。与其他两个按钮不同,第一个按钮(即左侧的按钮)同时验证三个验证组。

只需在下面的代码中包含在 aspx 页面末尾给出的 JavaScript,其中我已经覆盖了验证函数IsValidationGroupMatch,因此可以验证多个组。然后,如果您想在客户端验证多个组,则必须调用Page_ClientValidate("group1,group2,group6,group5")您只需向其传递以逗号分隔的验证组列表的函数。

(注意:但请记住,通过使用这种方法,您只能在客户端验证多个验证组。这不会自动在服务器端验证多个组。您必须Page_ClientValidate在客户端调用 API 函数,因为多个组验证不会被 ASP.Net 框架自动连接。)

允许在客户端同时验证多个组的示例 aspx 页面代码

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MultipleValidationGroupsByOneButton.aspx.cs" Inherits="MultipleValidationGroupsByOneButton" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>

</head>
<body>
    <form id="form1" runat="server">
        <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"  onclientclick="if(!Page_ClientValidate('group1,group2,group3')) { return false;}" />
        <asp:Button ID="btnGroup1" runat="server" Text="Validate only group1" ValidationGroup="group1" />
        <asp:Button ID="btnGroup2" runat="server" Text="Validate only group2" ValidationGroup="group2" />
        <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(",");
                    }
                    for (var i = 0; i < controlGroupArray.length; i++) {
                        if (controlGroupArray[i].trim() == controlGroup.trim()) {
                            isGroupContained = true;
                        }
                    }
                }
                return (controlGroup == validationGroup || isGroupContained);
            }
        </script>
    </form>
</body>
</html>
于 2016-06-06T03:56:50.230 回答