【问题标题】:jQuery dialog not working after server-side redirectjQuery 对话框在服务器端重定向后不起作用
【发布时间】:2010-10-06 20:18:45
【问题描述】:

我有一个 ASP.NET 网站,它使用 jQuery 对话框向用户显示下载条款对话框。一旦用户同意对话框中的条款,我将执行服务器端回发,该回发向另一个网站上的页面发出 Response.Redirect 调用,该页面负责将下载提供给浏览器。问题是一旦调用了 Response.Redirect,对话框就不能再显示了。

我使用以下代码在 document.ready 事件中初始化对话框:-

$("#terms-dialog").dialog({
  modal: true,
  autoOpen: false,
  autoResize: false,
  height: 420,
  width: 500,
  overlay: {
    opacity: 0.5,
    background: "black"
  }
});

显示对话框的代码如下:-

function showTermsDialog(snippetid, title, agreement, url)
{
  $("#terms-dialog-text").html(agreement);
  $("#terms-dialog-controls").attr("style", "display: block;");
  $("#<%= this.SnippetID.ClientID %>").attr("value", snippetid);
  $("#<%= this.DownloadUrl.ClientID %>").attr("value", url);
  $("#terms-dialog").data("title.dialog", title); 
  $("#terms-dialog").dialog("open");
}

此代码允许我多次成功显示对话框,但在 Response.Redirect 调用之后,对 dialog("open") 的调用不再有效。

有没有人做过类似于我在这里尝试做的事情?或者,如果有人可以提供任何 jQuery 对话框调试技巧,也将不胜感激。

【问题讨论】:

    标签: c# asp.net javascript jquery jquery-ui


    【解决方案1】:

    问题似乎是由我的对话框使用的扩展功能引起的,该功能将 jQuery 对话框定位到页面的表单部分,以确保服务器端回发能够正常工作。我改变了这段代码的行为,改为简单地关闭对话框,然后使用以下手动调用服务器端回调

    <%= this.Page.ClientScript.GetPostBackEventReference(btnAgree, "") %>;
    

    【讨论】:

      【解决方案2】:

      不幸的是,我不能说任何可能的原因,但是在您的位置上,我尝试从一些调试代码开始,使用诸如Firebug 工具作为控制台和断点。也许会发生某种 var 初始化或类似错误。希望这篇小贴士对你有所帮助。

      【讨论】:

        【解决方案3】:

        您可能做错了几件事。

        首先初始化对话框,你把它放在这里了吗?在

        $(document).ready( function() { ... } );
        

        如果没有,您应该这样做。假设您确实重定向了用户,并且在该重定向中您重定向到上一页(具有对话框的页面),因此 (document).ready 再次启动并初始化对话框。

        但是,使用 ASP.NET,您不应该像现在这样做,考虑一个简单的表单,对您和用户来说。

        在 jQuery 中使用 .load 可以加载不同的页面,因此假设您在对话框中有一个名为“我同意”的按钮,它为用户提供请求的文件:

        $(document).ready( function() {
          $("#terms-dialog").dialog({
            modal: true,
            autoOpen: false,
            autoResize: false,
            height: 420,
            width: 500,
            overlay: {
              opacity: 0.5,
              background: "black"
            },
            buttons: {
              I do not agree: function() { $(this).dialog('close'); }
              I agree: function() { 
                GetFileIfCookieExist("myfile.xls");
                $(this).dialog('close'); 
              }
            }
          });
        });
        
        function GetFileIfCookieExist(file) {
          // create cookie here
          $.load("getFile.aspx", { "f": file }, function() {
            // you can show a "loading" image
          });
        }
        

        在您的 getFile.aspx 中,删除除第一行以外的所有 HTML 代码,并在代码隐藏 Page_Load 事件中处理请求并使用 Response.Write 方法写回文档,例如:

        Response.Clear(); 
        Response.AddHeader("content-disposition", "attachment;filename=" + Request["f"]);
        Response.Charset = "";
        Response.ContentType = "application/vnd.xls";
        
        System.IO.StringWriter stringWrite = new System.IO.StringWriter();
        stringWrite = AppendMyFile();
        
        Response.Write(stringWrite.ToString());
        Response.End();
        

        记得在请求中创建一个 cookie 并检查 aspx 页面中的 cookie,如果它不存在那是因为用户强制下载它,然后在将文件发送回用户之前删除 cookie。

        cookie 只是一种确保可信度的策略,但它并非完美无缺,因为您需要用户启用 cookie(就像 Hotmail 所做的那样,以便您在其网站上阅读电子邮件),您可以使用 Session 对象或其他方法你可以考虑一下。

        这只是为了让您更好地了解自己可以完成什么。

        【讨论】:

        • 我确实在 $(document).ready 中初始化了对话框,并以与您建议的方式类似的方式提供内容,但下载完成后用户不会被重定向回来,所以 $( document).ready 不会再次触发。我确实有确保对话框再次初始化的逻辑,但它没有帮助
        • 您在使用 UpdatePanel 吗?如果是,也许您可​​以使用我在这里回答的一个简单技巧:stackoverflow.com/questions/536605/…
        【解决方案4】:

        当我们从页面发送请求时,jquery 脚本成功执行,但是当我们在发送重新查询的同一页面上获得响应时,jquery 脚本没有执行。 这就是你的弹出窗口不显示的原因

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-07
          • 1970-01-01
          • 2011-04-29
          • 2017-12-22
          • 2015-09-29
          • 1970-01-01
          • 1970-01-01
          • 2017-09-02
          相关资源
          最近更新 更多