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

时间:2010-07-30 09:58:12

标签: javascript asp.net https

我的情况是在c#代码中我添加了一个onclick客户端事件处理程序。 应该这样做:

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

最后,网址如下:

https://servername/reports/?type=1&id=2

在我的网站的reports文件夹中,我有一个处理这些参数的默认aspx页面。

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

https://servername/reports/default.aspx?type=1&id=2

页面打开但是空白。

当我使用HTTP运行此代码为非安全时,一切都正常运行。报告打开了。

使用default.aspx和没有它的那两个不同的URL是否有任何区别,因为在开发中它的行为方式相同,但在HTTPS下,一个页面不存在而另一个页面是空白的?! HTTPS是原因吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

您可能还想在脚本中添加return = false。

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

答案 1 :(得分:0)

发现解决方案,除了WOOW我没什么可说的! 它与ssl或IIS或路径无关,它与windows temp文件夹中的permisions有关,而crystal report无法保存临时文件。

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

答案 2 :(得分:-1)

  • JavaScript不会在字符串文字中插入变量名称。您确实使用服务器名称Request.ServerVariables["HTTP_POST"],因为它不是真正的服务器名称(甚至在URL中有效),它将无法打开。

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

  • 您可能需要HTTP_HOST,而不是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>

(在ASP.NET 4中,您可以使用<%:代替<%=来避免Server.HTMLEncode任何内容的需要。可能不会有任何HTML特殊字符主机名,但习惯于HTML编码是一个很好的做法,因为错过任何一个更重要的,你自己注入HTML可能会导致XSS安全漏洞。)

然而,这通常被认为是模板的老式方式;通常首选ASP.NET HTML控件。您还应该考虑使用target="_blank"属性而不是所有JS复杂性。 (虽然它在HTML 4 Strict中无效,但它回到HTML5中并且更易于维护。)

<asp:HyperLink id="thelink" Target="_blank" Text="some link text"/>

// VBS in Page_Load:
thelink.NavigateUrl= "https://" & Request.ServerVariables["HTTP_POST"] & "/reports/?type=1&id=2";

最后,您还应该考虑根本没有弹出窗口。许多用户认为它是敌对的(如果我想在新窗口中,我点击'在新窗口中打开')。此外,在某些浏览器中,无论如何它都会在新标签页中打开而不是新窗口,这可能是您不想要的。