2010-07-30 81 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

相關問題