jQuery 对话框在服务器端重定向后不起作用

Posted

技术标签:

【中文标题】jQuery 对话框在服务器端重定向后不起作用【英文标题】:jQuery dialog not working after server-side redirect 【发布时间】: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 对话框调试技巧,也将不胜感激。

【问题讨论】:

【参考方案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 吗?如果是,也许您可​​以使用我在这里回答的一个简单技巧:***.com/questions/536605/…【参考方案4】:

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

【讨论】:

以上是关于jQuery 对话框在服务器端重定向后不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Zend Framework appendFile 在 jQuery 包含后不起作用

jQuery Mobile:.animate(scrollTop) 在修复页面转换后不起作用

为啥servlet中的response.sendRedirect()在收到JQuery的post请求后不起作用?

复选框检查jquery在加载后不起作用

jQuery tablesorter 插件在 AJAX 调用后不起作用

jquery datepicker在导航到另一个组件后不起作用