我有一个问题,它适用于一个按钮,而不适用于另一个。
一个有效的按钮是调用 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 is true so...”。我已为渲染时的事件验证注册了此按钮:
protected override void Render(HtmlTextWriter writer)
{
this.Page.ClientScript.RegisterForEventValidation(btnAlquilar.UniqueID);
base.Render(writer);
}
那么为什么会在这里发生呢?为什么这次不行?
编辑:现在我检查了,由 ModalPopup 中的工作按钮更改的标签包含在 UpdatePanel 中。我不知道这是否重要,但只是要注意它。
EDIT2:该页面也适用于母版页。不知道有没有用。我尝试使用 UpdatePanels 和使用 AsyncPostBackTrigger 包装 Edit 按钮和 GridView,但我仍然得到相同的异常。