2010-07-30 193 views
0

我有我在添加一个onclick客户端事件处理程序在C#代码的情况。 它应该做的:使用javascript打开新的https浏览器窗口

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 
在我的网站上的报告文件夹

我有一个处理这些参数默认aspx页面。

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

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

页面打开但它是空白的。

当我运行此代码为非安全与HTTP,一切工作就像它应该。报告打开。

有没有使用这两个不同的URL与Default.aspx的,没有任何区别,因为在发展它的工作方式,但在一个HTTPS页面不存在,另一个是空白的? 是HTTPS的原因?

谢谢!

+0

这可能与'window.open'没有任何关系。如果您直接输入其中一个网址会发生什么? – 2010-07-30 10:08:00

+0

与代码相同。 一种方式没有显示,其他方式不存在。 并输入任何其他网址打开该页面,但这两页不。 我不能使用调试,看看发生了什么,因为这是在生产中,和日志文件错误,但这是错误无论如何.. 我很困惑.. 你认为它与网址本身或https? – 100r 2010-07-30 10:21:36

回答

0

解决方法找到了,除了WOOW,我没有什么可说的! 它与ssl或IIS或路径无关,它与Windows临时文件夹中的权限相关,并且Crystal报告无法保存临时文件。

希望这会帮助别人。

-1
  • JavaScript不插入字符串文字中的变量名称。你真的使用服务器名称Request.ServerVariables["HTTP_POST"],并且因为这不是一个真正的服务器名称(甚至在URL中有效)它不会打开。

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

  • 你可能是指HTTP_HOST,不POST

  • 你并不需要一个事件处理程序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编码是一种很好的习惯,因为错过任何更重要的地方,并且您已经获得了可能导致XSS安全性的HTML注入洞)。

但是,这通常被认为是一种老式的模板方式; ASP.NET HTML控件通常是首选。您还应该考虑简单地使用target="_blank"属性,而不是所有的JS复杂性。 (虽然它是无效的HTML 4严格,这是早在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"; 

最后,你应该也一定要考虑没有一个弹出的。许多用户认为它是敌对的(如果我想在新窗口中使用它,我会点击'在新窗口中打开')。此外,在某些浏览器中,它会在新选项卡中打开,而不是新窗口,而这可能不是您想要的。

+0

对不起,我没有输入它应该链接的最重要的东西。再次检查问题的顶部。 事件处理程序是从代码添加的,而不是html。 再次测试环境中的http可以正常工作。 Https是生产中的问题。 这变得非常强调! 星期一是这一天,这是行不通的:( 并感谢这个长的答案,但我无法在这里找到答案 – 100r 2010-07-30 11:20:31

+0

我的意思是检查Button1.Attributes.Add ... – 100r 2010-07-30 11:31:19

+0

如果这是现在的实际代码:你在属性值的末尾缺少'')'。但是这只是表明你为什么不这样做,它很混乱,易于逃避问题,而且很难阅读。将JS踢出静态代码,将URL保留在正常链接中。如果你愿意,你可以像一个按钮一样来设计它。 (并且永远不要使用'javascript:'。) – bobince 2010-07-30 11:32:33

0

您可能还想要将return = false添加到脚本中。

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

它与javascript或https最终没有任何关系。在服务器上运行,服务器上它没有,那个页面上有Crystal报表查看器,在两台机器上,CR的安装方式相同,还有另一个报告页面也运行CR,我不知道,这不是一个问题了,我怀疑任何人都可以提供帮助,这可能与我们没有看到或者我不知道的IIS有关,所有我知道的是我正在失去我的想法 Tnx无论如何! – 100r 2010-07-31 07:54:23

相关问题