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请求后不起作用?