服务器端重定向后jQuery对话框无法正常工作

时间:2009-02-11 06:35:04

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

我有一个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调用后,对话框(“打开”)的调用不再有效。

有没有人做过类似我试图在这里做的事情?或者,如果任何人都可以提供任何jQuery对话框调试技巧,那么这些也将受到赞赏。

4 个答案:

答案 0 :(得分:1)

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

手动调用服务器端回调
<%= this.Page.ClientScript.GetPostBackEventReference(btnAgree, "") %>;

答案 1 :(得分:0)

不幸的是,我不能说出任何可能的原因,但是在我的地方,我试图使用诸如控制台和断点之类的Firebug工具开始使用一些调试代码。也许会发生某种变形或类似的错误。希望这个提示会对你有所帮助。

答案 2 :(得分:0)

有些事情你可能做错了。

首先对话框的初始化,你有没有把它打过去?在

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

如果没有,你应该。假设您重定向用户并在该重定向中重定向到上一页(具有对话框的那个),因此(文档).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中删除除第1行以外的所有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对象或其他方法你可以考虑一下。

这只是为了让您更好地了解自己可以取得的成就。

答案 3 :(得分:0)

当我们从页面发送请求时,jquery脚本成功执行但是当我们在发送requery的同一页面上进行响应时,jquery脚本不会被执行。 这就是你弹出不显示

的原因