1

マークアップを貼り付けたいのですが、複雑すぎて、クライアントの会社名への参照が多数含まれています。豊富な経験を持つ誰かが私を正しい方向に向けることができることを願っています.

検証グループの一部ではない ValidationSummary を含むマスター ページがあります。コンテンツ ページには、ValReject という検証グループに割り当てられた別の ValidationSummary があります。コンテンツ ページには、ClientValidationFunction とボタンを使用する CustomValidator もあり、どちらも ValReject に割り当てられています。

ボタンをクリックすると、クライアント関数が 1 回実行されますが、コンテンツ ページの検証サマリーとマスター ページの検証サマリーの両方にエラーが報告されます。3 つ目の検証サマリーを追加して、そのグループを「asdf」などに設定しましたが、同様に報告されます。つまり、3 つの検証サマリーすべてがページに同じエラーを表示しています。

次に、別の ASP.NET テスト プロジェクトを作成し、すべてのコードを貼り付けて実行したところ、正常に検証されました。

次に、コンテンツ ページで AutoEventWireup をいじってみました。false に設定すると、検証は機能しますが、ページ読み込みイベントは発生しません。どうしたの?

コード サンプルが必要な場合があることは承知していますが、前述のように、大きな頭痛の種を経験せずにそれを行うことはできません (信じてください、マスター ページとコンテンツ ページのマークアップは膨大です。

ここでの質問は次のとおりです: 1 つのバリデータが、ページ上のすべてのバリデーション サマリーにレポートする原因について、そのうちの 1 つだけがバリデータおよびボタンと同じバリデーション グループを共有しているにもかかわらず、何が原因か考えている人はいますか?

編集: マークアップをテスト アプリに貼り付けたとき、テスト アプリには実際のマスター ページで使用される一部のアセンブリへの参照がないため、機能させるためにいくつかのタグを削除する必要がありました。私が削除したいくつかのものは次のとおりです。

<%@ Register Assembly="RadMenu.Net2" Namespace="Telerik.WebControls" TagPrefix="radM" %>

<radM:RadMenu ID="RadMenu1" runat="server" DataSourceID="smdsMenu" Skin="CssGrey" ClickToOpen="True" EnableViewState="False" CausesValidation="false" />

したがって、テスト アプリで動作するという事実は、テスト アプリで行っていないことを本番アプリで行っているという結論につながります。はい、これが漠然としていることは承知していますが、誰かの頭の中で電球が消える可能性があります。

4

3 に答える 3

3

男、何時間も車輪を回転させた後、ついにそれを理解しました。この拡張メソッドを使用して、ボタンのダブルクリックを無効にします。

    public static void DisableDoubleClick(this Button Control)
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();

        sb.Append("if (typeof(Page_ClientValidate) == 'function') { ");
        sb.Append("if (Page_ClientValidate() == false) { return false; }} ");
        sb.Append("this.disabled = true;");
        sb.Append(Control.Page.ClientScript.GetPostBackEventReference(Control, ""));
        sb.Append(";");
        Control.Attributes.Add("onclick", sb.ToString());
    }

これは、グローバル検証を呼び出していたため、検証を台無しにしていたものです。次の変更を加えることでこれを修正しました。

        sb.Append(string.Format("if (Page_ClientValidate({0}) == false) {{ return false; }}}} ",
            Control.ValidationGroup == string.Empty ? string.Empty : string.Format("\"{0}\"", Control.ValidationGroup)));

AutoEventWireup を false に設定して、何が起こるかを確認したとき、私にヒントがありました。これにより、上記の拡張メソッドが呼び出されていたページ読み込みイベントが発生しなくなりました。干し草の山の中の何針、この問題。

詳細が不足しているために回答しなかったことを誰も責めませんが、他の誰かが使用できる場合に備えて、これを維持します.

編集: slfan と gbs に感謝します。私は問題を把握したばかりで、回答を投稿するためにここに戻ってきました。あなた方 2 人が本質的に問題の両側から私の問題に取り組んでいることがわかりました。ページ読み込みイベントは、バインディングが発生していた場所であり、呼び出された拡張メソッドが Page_ClientValidate 関数を台無しにしていました。あなたの両方が技術的に正しいので、私はあなたの両方に答えを与えることはできません. お二人は、最小限の詳細でコード サンプルを使用せずに、このような問題を分析するのが得意です。小道具。

于 2011-05-20T19:34:14.800 に答える
1

私が探す2つのこと:

1:JavaScriptで行われているPage_ClientValidateを使用した外部検証

2:コードビハインドでのPage.Validate()の明示的な呼び出し

于 2011-05-20T19:18:58.683 に答える
1

AutoEventWireup により、ASP.NET は Page_Load イベントを自動的に呼び出します。イベントに登録する必要はありません。別の方法として、OnLoad メソッドをオーバーライドすることもできます。Page_Load が呼び出されていない場合、ページは正しく動作しているようです。このメソッド内で何をしますか? いくつかの奇妙なデータバインディング? このコードのコメントを外したらどうなりますか? このように、質問に表示されていない実際の問題に問題を絞り込むことができます。

于 2011-05-20T19:03:41.140 に答える