0

我正在构建一个 ASP.NET 站点,其功能之一是单击链接时,它会打开一个新选项卡。该链接称为 ASHX Http 处理程序,它在幕后执行一些处理。我想要的是能够获取链接的文本(例如,如果一个人单击了一个显示 Document 100.txt 的链接)并将其显示在新打开的 ASHX Http 处理程序的窗口标题中。

我目前正在使用: Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "script", "<script>window.open('Handler.ashx?fileName=" + fileName + "');</script>", false);

这会完美地打开处理程序,只是我无法获得为新选项卡显示的标题。这将是有益的,因为用户可以一次打开任意数量的链接,并且一目了然,他或她应该能够根据窗口标题区分哪个选项卡是哪个选项卡。

我尝试过类似的 var w = window.open(...); w.document.title=fileName 东西 var w = window.open(...); w.document.write('<title>' + fileName + '</title>');

并且这些都不能正常工作(因为我正在写入处理程序中的上下文对象,因此也很难写入它以添加标题)。

如果有人有一些想法或建议,将不胜感激。谢谢

4

1 回答 1

0

我意识到这个问题现在已经很老了,所以不幸的是你可能已经继续前进了,但是对于那些将来会发现这个问题的人。我试图做类似的事情。ASP 站点有指向带有 PDF 报告的文件夹的链接。ASHX 处理程序运行以确保授权,然后它传输适当的 pdf,使用window.open(...). 作为参考,这些是我正在测试的浏览器:

  • 铬 V60.0.3112.113
  • 火狐V55.0.3
  • 边缘 V40.15063.0.0
  • IE11

使用任何类似的东西:

var newWin = window.open("PrivateFileHandler.ashx?VariablesForTheHandler");

// add a load listener to the window so that the title gets changed on the page load
newWin.addEventListener("load", function() {
    newWin.document.title = "NewTitle";
});

不工作。我从这里的 SO 答案中提取了这个想法。

一旦我意识到<head>甚至没有添加一个<title>,我就尝试了这个:

newWin.addEventListener("load", function() {
    newWin.document.getElementsByTagName('html')[0]
    .appendChild(newWin.document.createElement('head'))
    .appendChild(newWin.document.createElement('title'))
    .appendChild(newWin.document.createTextNode('NewTitle'));
});

这是我从另一个关于 SO的答案中得出的。<title>以这种方式添加时,Chrome 会忽略该字段中的“NewTitle” 。虽然当我使用 Developer F12 工具手动更改它时,选项卡的标题发生了变化。我无法让它自动工作。Firefox 和 Edge 覆盖了整个<head>. 到那时我什至没有在 IE11 中尝试过。我所有的新标签仍然有“PrivateFileHandler.ashx ...”

在上面两个链接的问题/答案中,我的 JS 代码示例有一些排列。IE。使用newWin.onload = function(){ ... };而不是addEventListener( ... )函数。有一个 JQuery 选项可以添加<head>,以及另一个利用该setTimeout(...)功能的解决方案。随意参考这些链接和答案来尝试这些解决方案。但是,鉴于我的测试,这些选项不会对我产生影响。

我最初的目标(如上面的@J-man)是将正在传输的 pdf 文件的名称放入选项卡标题中。我的解决方案实际上并没有涉及对我的 javascript 的任何更改。为此,我删除了报告文件夹中的网络配置:

<?xml version="1.0"?>
<configuration>
    <system.webServer>
      <security>
        <requestFiltering>
          <denyUrlSequences>
            <add sequence="/" />
          </denyUrlSequences>
        </requestFiltering>
      </security>
    </system.webServer>
</configuration>

这最初关闭了我的文件夹,以便只有 PrivateFileHandler(而不是 IIS)可以传输 PDF。然后按照这个 MSDN 指南,我将我的应用程序配置为通过我的 PrivateFileHandler 发送报告/xxx.pdf 的所有请求。

<handlers>
  <add name="PrivateFileHandler" verb="*"
    path="Reports/*.pdf"
    type="PrivateFileHandler"
    resourceType="File" />
</handlers>

我在集成模式下运行 IIS 7.0。那里有关于在 IIS 6.0 和经典模式下的 IIS 7.0 中执行相同操作的说明。我的 PrivateFileHandler 需要进行一些调整来处理这种请求,但是当它交付 PDF 内容时,浏览器选项卡标题就是 PDF 的名称。

旁注 - 如果您想在新选项卡/窗口中打开文件,请务必将此标题包含在您的Response

context.Response.AddHeader("content-disposition", "inline; filename=\"" + FileName + "\"")
于 2017-09-27T20:19:42.110 回答