1

我正在重构旧版 Web 应用程序。这个应用程序有一个正在使用正文标记(在母版页上)内的 onload 事件来运行这个 javascript 脚本。请注意,此脚本标记位于文档中的表单元素之后。我知道语法看起来很可怕(或者 Visual Studio 至少通过曲线告诉它),但我会被诅咒的,这件事确实有效。

function DisplayPDF()
{
    var strPDF
    strPDF = "<%=SESSION("PDF")%>";
    if (strPDF.length != 0)
     {
        window.open(strPDF);
        <%Session("PDF") = ""%>
     }
}

我的问题是我正在尝试开发一个更优雅的解决方案。我可以使用 ASP.NET ajax 和 jQuery。我写了一个很小的 ​​asp.net ajax 组件,我想用它来处理这个问题。

Type.registerNamespace("ck");

ck.pdfOpener = function() {
  ck.pdfOpener.initializeBase(this);
}

ck.pdfOpener.prototype = {
    initialize: function() {
        ck.pdfOpener.callBaseMethod(this, 'initialize');
    },

    dispose: function() {        
        ck.pdfOpener.callBaseMethod(this, 'dispose');
    },

    openPDF: function(){
       //HOW CAN I RETRIEVE A SESSION VARIABLE HERE???
    }
}

ck.ClientControl.registerClass('ck.pdfOpener', Sys.Component);
if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();

我可以/应该这样做吗?或者我应该创建一个返回所述变量的 WebService。感谢您的任何建议。

干杯,
~ck 在圣地亚哥

4

3 回答 3

1

在后面的代码中使用Page.ClientScript.RegisterClientScriptBlock(typeof(YOURPAGECLASS), "KEY", "ACTUALJSCODE");(即 Page_Load 事件处理程序)

于 2009-07-09T15:48:26.160 回答
1

或者,您可以直接从 asp.net 页面而不是在客户端脚本中发送 PDF 文件。

string pdfFile = Session("PDF");
if (!string.IsNullOrEmpty(pdfFile))
{
  Session.Remove("PDF");

  Response.ContentType = "application/pdf";
  FileInfo fi = new FileInfo(pdfFile);
  Response.AddHeader("Content-Disposition", "attachment; filename=\"" + Path.GetFileName(pdfFile) + "\"");
  Response.AddHeader("Content-Length", fi.Length.ToString()); 
  Response.WriteFile(pdfFile);
  Response.Flush();
  return;
}
于 2009-07-09T20:44:22.457 回答
0

一种简单的方法是,正如您所说,只需对从会话返回所需值的页面方法、MVC 操作、HttpHandler 或 Web 服务进行 Ajax 调用。这里更大的问题是为什么要在会话状态中存储 PDF 文件的路径?

于 2009-07-09T15:51:30.927 回答