あるボタンでは機能し、別のボタンでは機能しないという問題があります。
機能するのは、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 を使用しようとしましたが、それでも同じ例外が発生します。