0

あるボタンでは機能し、別のボタンでは機能しないという問題があります。

機能するのは、ModalPopup を呼び出して UpdatePanel 内の GridView に新しい行を追加するボタンです。成功した場合はメッセージ付きのアラートがポップアップ表示され、そうでない場合は例外メッセージ付きの別のアラートがポップアップ表示されます。このコードは、ModalPopupExtender 内にあることを除いて、他のコードと非常によく似ています。

EventValidation に関する既知の例外をスローするボタンは次のようになります。

ウェブ:

<asp:Button ID="btnAlquilar" runat="server" Text="Alquilar" CssClass="AdminButtons"
                                 OnClientClick="Click_Alquilar(); return false"/>

呼び出す JavaScript 関数

function Click_Alquilar() {
        if (index == '') {
            alert("Debe elegir una película para alquilar");
        }
        else {

            if (confirm("¿Quiere alquilar la película '" + selected.childNodes[2].innerText + "'?")) {
                __doPostBack('<%= btnAlquilar.UniqueID %>', index);
            }
        }
    }

index は、GridView で選択された行のインデックスです (同様のアーキテクチャで実行され、正常に動作します)。

コード ビハインドは Page_Load メソッドで開始され、問題のある関数を呼び出します。

 protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {...}
            else
            {
                ProcessAjaxPostBack(sender, e);
            }
        }
private void ProcessAjaxPostBack(object sender, EventArgs e)
        {
            if ((Request.Params["__EVENTTARGET"] != null) && (Request.Params["__EVENTARGUMENT"] != null))
            {
                ...

                if (Request.Params["__EVENTTARGET"] == this.btnAlquilar.UniqueID)
                {
                    index = Convert.ToInt32(Request.Params.Get("__EVENTARGUMENT").TrimStart('r', 'o', 'w'));
                    btnAlquilar_Click(Request.Params.Get("__EVENTARGUMENT"));
                }    

            }
        }

protected void btnAlquilar_Click(string id)
        {
            string message = "";
            if (BAC.BAC.CheckUserAge(lblUserId.Text) < Convert.ToInt32(dgvPeliculas.Rows[index].Cells[7].Text))
            {
                btnBorrar.Visible = false;
                btnEditar.Visible = false;
                btnNuevo.Visible = false;
                System.Web.UI.ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), Guid.NewGuid().ToString(), "alert('No tiene la edad mínima para alquilar la película.')", true);
            }
            else
            {
                try
                {
                    BAC.BAC.NewAlquiler(lblUserId.Text, dgvPeliculas.Rows[index].Cells[0].Text, dgvPeliculas.Rows[index].Cells[9].Text);
                }
                catch (Exception ex)
                {
                    message = Change_ExceptionMessage(ex.Message);
                    System.Web.UI.ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), Guid.NewGuid().ToString(), "alert('No se pudo alquilar la película: " + message + "')", true);
                }
            }

        }

RegisterClientScriptBlock メソッドは、私が他のボタンに使用するものと同じです (これは、これより複雑なことは何もしません。問題がある場合は、ポップアップのラベルのテキストを変更し、アラートを表示します。正しい場合は、それが表示されます)。 GridView を読み込み、成功アラートを表示します)、そこで動作します。ここでは、「EnableEventValidation が true なので...」という例外をスローします。レンダリング時のイベント検証用にこのボタンを登録しました:

protected override void Render(HtmlTextWriter writer)
        {
            this.Page.ClientScript.RegisterForEventValidation(btnAlquilar.UniqueID);
            base.Render(writer);
        }

では、なぜここでこれが起こるのですか?今回はなぜうまくいかないのでしょうか?

編集:確認したところ、ModalPopup の作業ボタンによって変更されたラベルは UpdatePanel にラップされています。関係あるか分かりませんが、念のため。

EDIT2: このページは、マスター ページ内でも機能します。役に立つかどうかはわかりません。Edit ボタンと GridView の両方を UpdatePanels でラップし、AsyncPostBackTrigger を使用しようとしましたが、それでも同じ例外が発生します。

4

2 に答える 2

0

OK、それに興味がある人にとって、問題は_doPostBack呼び出しにありました。渡した引数( _EVENTARGUMENT)は動的であったため、RegisterForEventValidationメソッドを介してこれらのイベントを登録することはできませんでした。これは、コントロールのUniqueIDとそれとともに渡される引数の2つの定数文字列(AFAIK)を要求するためです。

そのため、ボタンのUniqueID以外の引数をdoPostBackに渡すのをやめ、関心のある変数を他のメディアを介して渡しました(主に、非表示フィールドの値をPageクラス内のグローバル変数に渡しました)。

これで問題は解決し、プログラムは意図したとおりに機能しました。AutoPostBackを生成せず、更新せずにグリッドの値を変更しないように、GridViewと同じ更新パネル内にボタンをラップしました。

誰かがコードに興味があるなら、私は提供することができます。

于 2012-04-19T19:17:58.687 に答える
0
OnClientClick="Click_Alquilar(); return false"
instead of this use
OnClientClick="return Click_Alquilar();


and in javascript
use return false;
in functions like

function Click_Alquilar() {
        if (index == '') {
            alert("Debe elegir una película para alquilar");
return false;
        }
        else {

            if (confirm("¿Quiere alquilar la película '" + selected.childNodes[2].innerText + "'?")) {
                __doPostBack('<%= btnAlquilar.UniqueID %>', index);
            }
        }
    }
于 2012-05-02T19:29:06.567 に答える