使用javascript打开新的https浏览器窗口

使用javascript打开新的https浏览器窗口,javascript,asp.net,https,Javascript,Asp.net,Https,在c代码中,我添加了一个onclick客户机事件处理程序。 它应该做到: Button1.Attributes.Add("onclick", "javascript:window.open('https://"+Request.ServerVariables["HTTP_POST"]+"/reports/?type=1&id=2"); 最后,URL看起来像: https://servername/reports/?type=1&id=2 在我的站点的reports文件夹中

在c代码中,我添加了一个
onclick
客户机事件处理程序。 它应该做到:

  Button1.Attributes.Add("onclick", "javascript:window.open('https://"+Request.ServerVariables["HTTP_POST"]+"/reports/?type=1&id=2");
最后,URL看起来像:

https://servername/reports/?type=1&id=2
在我的站点的reports文件夹中,我有一个默认的aspx页面来处理这些参数

当我点击此事件的按钮时,会打开一个新窗口,但显示该地址没有页面。当我像这样使用链接时

https://servername/reports/default.aspx?type=1&id=2
页面打开了,但它是空白的

当我使用HTTP以不安全的方式运行此代码时,一切都正常工作。报告将打开

使用带有default.aspx和不带default.aspx的两个不同URL有什么区别吗?因为在开发过程中,它的行为是相同的,但在HTTPS下,一个页面不存在,另一个页面是空白的?! 原因是什么

谢谢

  • JavaScript不会在字符串文本中插入变量名。实际上,您使用的是服务器名
    请求.ServerVariables[“HTTP_POST”]
    ,由于这不是真正的服务器名(甚至在URL中无效),因此它不会打开

  • JavaScript是一种客户端语言,它无权访问
    Request.ServerVariables
    。您需要使用模板将变量从ASP输出到客户机文档中,如果要将某些内容放入JavaScript字符串文本中,通常应使用JSON编码,以停止文本中的
    '
    \
    字符(以及其他一些字符)破坏字符串。如果要输出到HTML事件处理程序属性中的JavaString文本,则必须对字符串进行JSON编码,然后再进行HTML编码。将内容放入事件处理程序所涉及的转义层既烦人又容易出错。通过不使用事件处理程序属性来避免它

  • 你的意思可能是
    HTTP\u主机
    ,而不是
    POST

  • 事件处理程序中不需要
    javascript:
    ;它没有任何作用。您正在考虑链接中的
    javascript:
    伪URL,但也不应该使用它们。将真正的URL放在一个普通链接中,这样它仍然可以在禁用JavaScript的情况下工作,并且不会因中键单击等选项而中断,然后使用JS扩展链接,以便在正常单击时在新窗口中打开

这被称为“渐进增强”:

<a class="newwindow" href="https://<%= Server.HTMLEncode(Request.ServerVariables["HTTP_POST"]) %>/reports/?type=1&amp;id=2">

<!-- at end of document -->
<script type="text/javascript">
    for (var i= document.links.length; i-->0;)
        if (document.links[i].className==='newwindow')
            document.links[i].onclick= newWindowClick;

    function newWindowClick() {
        var w= window.open(this.href);
        return !w || w.closed;
        // stops link being followed in the current page (return false)
        // unless pop-up was blocked
    }
</script>

最后,你也应该明确地考虑不要弹出。许多用户认为它是敌意的(如果我想在一个新窗口中看到它,我会点击“在新窗口中打开”)。另外,在某些浏览器中,它将在新选项卡中打开,而不是在新窗口中打开,这可能是您不希望看到的。

您可能还希望在脚本中添加return=false

    String s= "window.open('" + Request.Url.AbsoluteUri.Replace("http", "https") + "');return false;";
    ButtonTest.Attributes.Add("onclick", s);

解决方案找到了,我没什么可说的,除了呜呜! 它与ssl、IIS或路径无关,它与windows临时文件夹的权限有关,crystal report无法保存临时文件


希望这将对某人有所帮助。

这可能与
窗口无关。打开
。如果您直接输入这些URL中的一个,会发生什么?和从代码中输入的情况相同。一种方式没有显示,另一种方式不存在。输入任何其他url都会打开该页面,但这两个页面不会打开。我无法使用debug查看发生了什么,因为这是在生产中,并且日志文件出现了一些问题,但这是错误吗。。我很困惑。。你认为它与url本身或https有关吗?很抱歉,我没有键入它应该输入的最重要的链接。再次检查问题的顶部。Eventhandler是从代码而不是html添加的。同样,它在测试环境中与http配合良好。Https是生产上的一个问题。这变得很紧张!星期一是一天,但这不起作用:(感谢您给出了这么长的答案,但我在这里找不到答案。如果这是现在的实际代码:您缺少属性值末尾的
。但这仅仅说明了为什么你不应该这样做,它令人困惑,容易逃避问题,而且很难阅读。将JS踢出到静态代码中,将URL保留在正常链接中。如果您愿意,可以将其设置为按钮样式。(而且永远不要使用
javascript:
)我认为这不是实际的代码;I’我从另一台电脑上重新输入,这就是为什么会有打字错误。Txn的建议,但我认为这是关于https的,因为在常规的非安全环境中,它工作得很好(他正在服务器端构建脚本,这样它就不会包含字面上的代码。那么,你可以保存一个我们可以实际调试的真实测试用例吗?否则,这相当于浪费每个人的时间。我可以向你保证,没有理由不可以
窗口。打开
一个
https:
URL。它与javascrip无关最后是t或https。wierd正在运行。IIS中的设置在运行它的服务器上和不运行它的服务器上是相同的。该页面上有Crystal report viewer。在这两台机器上,CR的安装方式相同,并且还有另一个报告页面也运行CR。我不知道,这不再是一个问题。我怀疑是否有人能帮上忙p、 这可能是IIS的问题,我们看不到或我不知道。我只知道我正在失去理智。不管怎样,Tnx!
    String s= "window.open('" + Request.Url.AbsoluteUri.Replace("http", "https") + "');return false;";
    ButtonTest.Attributes.Add("onclick", s);