【问题标题】:Calling a code-behind function from JavaScript that may return another JavaScript function从 JavaScript 调用可能返回另一个 JavaScript 函数的代码隐藏函数
【发布时间】:2012-04-24 23:00:05
【问题描述】:

我有一个问题,它适用于一个按钮,而不适用于另一个。

有效的是一个按钮,它调用 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,但我仍然得到相同的异常。

【问题讨论】:

    标签: c# javascript asp.net gridview updatepanel


    【解决方案1】:
    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);
                }
            }
        }
    

    【讨论】:

      【解决方案2】:

      好的,对于那些对此感兴趣的人,问题出在 _doPostBack 调用上。由于我传递的参数 (_EVENTARGUMENT) 是动态的,因此我永远无法通过 RegisterForEventValidation 方法注册这些事件,因为它要求提供两个常量字符串 (AFAIK):控件的 UniqueID 和将与它一起传递的参数。

      所以,我停止向 doPostBack 传递按钮的 UniqueID 以外的参数,并通过其他媒体传递我感兴趣的变量(主要是将隐藏字段值传递给 Page 类中的全局变量)。

      这解决了问题并使程序按预期工作。我将按钮包装在与 GridView 相同的更新面板中,以免生成 AutoPostBack 并更改 Grid 的值而无需刷新。

      如果有人对代码感兴趣,我可以提供。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-31
        相关资源
        最近更新 更多