2012-04-12 8 views
0

この問題は、あるボタンでは有効で、別のボタンでは機能しません。JavaScriptから別のJavaScript関数を返す可能性のあるコードビハインド関数を呼び出す

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); 
      } 
     } 
    } 

を呼び出す関数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 is true so ..."という例外がスローされます。レンダリング時にイベント検証のためにこのボタンを登録しました:

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

なぜここでこれが起こりますか?なぜ今はうまくいかないのですか?

EDIT:ModalPopupの作業ボタンで変更されたラベルがUpdatePanelにラップされていることを確認しました。私はそれが重要かどうかわからないが、それをメモするだけである。

EDIT2:ページはマスターページ内でも機能します。それがどんな使い方であるかわからない。私は、UpdatePanelsと、AsyncPostBackTriggerを使用して、編集ボタンとGridViewをラップしようとしましたが、まだ同じ例外が発生します。

答えて

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); 
      } 
     } 
    } 
0

問題がある場合は、問題はのdoPostBack呼び出しで発生していました。私が渡した引数( _EVENTARGUMENT)は動的だったので、2つの定数文字列(AFAIK)を要求するため、RegisterForEventValidationメソッドを使用してこれらのイベントを登録することはできませんでした:コントロールのUniqueIDとそれと共に渡される引数。

私は、ボタンのUniqueID以外のdoPostBackに引数を渡すのをやめ、私が興味を持った変数を他のメディア(cheakly、隠しフィールドの値をPageクラス内のグローバル変数に渡しました)に渡しました。

問題を解決し、意図したとおりにプログラムを動作させました。私はAutoPostBackを生成せず、リフレッシュせずにGridの値を変更しないように、GridViewと同じ更新パネル内にボタンをラップしました。

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

関連する問題