【问题标题】:Run javascript after form submission in update panel?在更新面板中提交表单后运行javascript?
【发布时间】:2010-05-08 16:51:45
【问题描述】:

这快把我逼疯了!我在这里阅读了至少 5 个与我的问题密切相关的问题,并且可能仅来自谷歌搜索的 5 页左右。我就是不明白。

我试图在用户填写“注册已提交”的表格后出现一个 jqueryui 对话框,然后重定向到另一个页面,但我一生都无法让任何 javascript 工作,甚至没有一个警告。

这是我的更新面板:

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="upForm" runat="server" 
    UpdateMode="Conditional" ChildrenAsTriggers="False">
    <ContentTemplate>
               'Rest of form'
         <asp:Button ID="btnSubmit" runat="server" Text="Submit" /> 
              <p>Did register Pass? <%= registrationComplete %></p>
    </ContentTemplate>
</asp:UpdatePanel>

我要执行的 Jquery:(现在它位于标记的头部,autoOpen 设置为 false)

<script type="text/javascript"> 
function pageLoad() {

    $('#registerComplete').dialog({
        autoOpen: true,
        width: 270,
        resizable: false,
        modal: true,
        draggable: false,
        buttons: {
          "Ok": function() {
          window.location.href = "someUrl";
        }
        }
    });

}
     </script>

最后是我的代码:(注释掉所有我尝试过的东西)

Protected Sub btnSubmit_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSubmit.Click     
      'Dim sbScript As New StringBuilder()'
           registrationComplete = True
            registrationUpdatePanel.Update()

            'sbScript.Append("<script language='JavaScript' type='text/javascript'>" + ControlChars.Lf)'
            'sbScript.Append("<!--" + ControlChars.Lf)'
            'sbScript.Append("window.location.reload()" + ControlChars.Lf)'
            'sbScript.Append("// -->" + ControlChars.Lf)'
            'sbScript.Append("</")'
            'sbScript.Append("script>" + ControlChars.Lf)'

            'ScriptManager.RegisterClientScriptBlock(Me.Page, Me.GetType(), "AutoPostBack", sbScript.ToString(), False)'
            'ClientScript.RegisterStartupScript("AutoPostBackScript", sbScript.ToString())'
                            'Response.Write("<script type='text/javascript'>alert('Test')</script>")'
            'Response.Write("<script>windows.location.reload()</script>")'
End Sub

我试过了:

  • 将变量从服务器传递到 客户端通过内联 在 头标签的javascript块。

  • 将相同的代码放入脚本中
    updatePanel 中的标签。

  • 尝试使用
    注册ClientScriptBlock 和
    注册启动脚本

  • 只是做一个 Response.Write 与 脚本标签写在里面。

  • 尝试了各种推杆组合 中的整个 jquery.dialog 代码 registerstartup 脚本,或者只是
    试图改变 autoOpen
    属性,或者只是在
    上调用“打开” 它。

我什至无法得到一个简单的警报来处理其中任何一个,所以我做错了,但我不知道它是什么。

这是我所知道的:

  • Jquery 甚至可以正确绑定 在异步回发上,因为 div 作为对话框的容器是 总是看不见,我看到了类似的 在此处发帖说明这是导致 一个问题,这里不是这种情况。

  • 使用 page_load 代替
    document.ready 因为这是应该的 在异步和正常上运行
    回发,所以这不是问题。

  • 更新面板正在更新 正确,因为 <p>Did register Pass? <%= registrationComplete %></p> 在我更新为 true 之后 提交表单。

那么我怎样才能做到这一点呢?我想要的只是->单击更新面板内的提交按钮->运行服务器端代码以验证表单并插入到数据库中->如果一切成功,则弹出该jquery(模态)对话框说嘿它有效。

【问题讨论】:

    标签: .net javascript jquery updatepanel postback


    【解决方案1】:

    您可以查看endRequest event:

    function pageLoad() {
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(sender, e) {
            // this function will be executed after the update panel finished 
            // the AJAX request, so here you may open your jQuery dialog
    
            if (e.get_error()) {
    
            } else {
    
            }
        });
    }
    

    【讨论】:

    • 那么我该如何像上面那样传递一个变量呢?我遇到的问题是我传入的变量 只在页面加载时运行一次。任何后续的异步回发都可能运行该代码,但它不会更新到registrationComplete 的最新值。您的示例中的 E 是什么?这页纸?因此,在您的示例中,我将在后面的代码中有一个 get_error() 函数,它会起作用吗?或者那会在Javascript中吗?如果在 Javascript 中,我仍然会遇到给它更新值的问题。
    【解决方案2】:

    要从 Codebehind 注册,here's the format

    ClientScript.RegisterStartupScript(GetType(), "AutoPostBackScript", 
                                       "alert('hi');", True);
    

    最后的true 告诉它将您的代码包装在&lt;script&gt; 标签中,如果您想自己做标签,请不要使用它。

    【讨论】:

    • @Nick:不知道为什么,但是在异步回发上注册 javascript 对我来说从来没有用过,除非我使用更新面板的类型 (UpdatePanel1.GetType()) 作为参数
    • @Claudio - 取决于从哪里调用它,应该从参与更新的控件中调用,更新面板本身并不是一个不好的类型,所以是的,它有效: )
    • 对于带有UpdatePanels 的页面,您应该使用ScriptManager 而不是ClientScript
    • @Nick Craver,你不能只调用 GetType()
    • @AverageJoe719 - 当然可以 - 您拨打的是Page.GetType(),就像您不需要拨打Page.Response.End()一样,只需拨打Response.End()
    猜你喜欢
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    相关资源
    最近更新 更多