11

私は3種類のバリデータを持っています:

  1. 「VG1」検証グループの一部です

  2. 「VG2」検証グループの一部です

  3. どの検証グループにも属していません

B1とB2の2つのボタンがあります。

B1.Click を検証したいのは、1 番目と 3 番目のタイプのすべてのバリデーターが、関連付けられたコントロールの検証に成功した場合のみです。

B2.Click を検証したいのは、2 番目と 3 番目のタイプのすべてのバリデーターが、関連付けられたコントロールを正常に検証した場合のみです。

これは ASP.NET で可能ですか? もしそうなら、どうすればこれを行うことができるか、またはこの質問で私を啓発する何かをどこで読むことができるか教えてもらえますか?

編集:

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

これはうまく機能しますが、VG1 が無効な場合、空のグループが検証されるため、メッセージが表示されなくなります。すべての検証エラー メッセージを表示するソリューションはありますか? ありがとうございました。

EDIT2:

    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 コードを試して、Web サイト プロジェクトでテストすることができます。サーバー側の自動検証が行われるかどうかをテストするには、3 つのバリデーターのそれぞれについて設定する必要がありますEnableClientScript="false"

複数グループの自動検証の考え方の説明

複数の検証グループを実装する場合は、aspx ページで次の手順を実行する必要があります。ValidationGroup一度に複数のグループを検証する必要がある場合は、マークアップで、ボタン コントロールのプロパティの検証グループのコンマ区切りのリストを必ず指定してください。

  1. aspx ページの末尾に JavaScript を追加して、JavaScript メソッドをオーバーライドする必要がありIsValidationGroupMatchます (このオーバーライドのコードは、以下のマークアップ コードの末尾に記載されており、コピーして aspx ページに貼り付けることができます)。これは、ASP.Net 検証フレームワークによって提供される標準的な方法です。
  2. これは ASP.Net によって自動的に行われないため、クライアント側の検証用に複数の検証グループを使用してボタンを接続する必要があります。HookupValidationForMultipleValidationGroupsこのためには、複数の検証グループを持つボタンごとに、Page_Load イベントのコード ビハインドでメソッドを呼び出す必要があります (2 番目のコード スニペットで指定されたこのメソッドをコピーして、aspx ページのコード ビハインドに貼り付けることができます)。
  3. Validateこれは 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" 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 に答える
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 Web サイト プロジェクトにコピーして、自分でテストすることができます。最初のボタン、つまり左側のボタンは、他の 2 つのボタンとは異なり、3 つの検証グループを同時に検証しています。

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 に答える