2013-11-15 70 views
1

我有一個現有的ASP.NET網頁,內含幾百行JavaScript代碼行。將JavaScript移到一個外部文件中時document.getElementById('<%= control.ClientID%>')

的代碼是完全的代碼引用服務器端控件的名稱,比如這個:

function SetVisibility(isVisible) { 
    document.getElementById('<%=someDiv.ClientID%>').style.display = (isVisible ? "block" : "none"); 
    } 

如果我移動腳本到外部.js文件中,.ClientID引用不再解決,並且頁面在一堆錯誤中崩潰。

解決此問題的最佳方法是什麼?我可以更改每個函數以將控件作爲參數,或者我可以用$ find()替換.getElementByID ...但我希望有一種更簡單/更快的方法。

+0

嘗試將所有變量賦值頁面移動到一個js變量,並在這些函數中使用該變量。如果你是在4.0版本,你也可以使用clientID靜態模式,所以你不必做前面的步驟。原因是js文件不是由asp.net引擎渲染的,所以這些永遠不會得到解決。如果您使用的是像jquery這樣的插件,那麼您可以輕鬆地將className分配給您的控件的cssClass,甚至可以讓Id包含某些東西(例如:id包含someDiv)。 – PSL

+0

''......或任何ASP.Net引擎處理(cshtml,ashx,vbhtml)? – EdSF

+0

看看這個以及http://www.netfxharmonics.com/2007/09/Creating-JavaScript-objects-from-ASPNET-objects – PSL

回答

3

您不能將內聯ASP.NET語法(如<%= or <#)移動到您的外部JavaScript文件。

所有你需要的是,你應該有一個適當的參考元素ID。

情況1:

由ASP.Net運行時和沒有的ClientIDMode產生 可用(ASP.Net < 4.0)

ID汽車:

在.aspx頁面

<script type="text/javascript"> 
var myHtmlElementIDs={}; 
myHtmlElementIDs.ContainerDiv='<%=someDiv.ClientID%>'; 
</script> 

在JS文件

function SetVisibility(isVisible) { 
    document.getElementById(myHtmlElementIDs.ContainerDiv).style.display 
    = (isVisible ? "block" : "none"); 
    } 

情況2:

上生成客戶ID控制。無母版頁或嵌套控制 使用,或ClientIDMode=Static可用(ASP.Net> = 4.0)

解決方案沒有必要擔心的ClientID,因爲它不會改變

function SetVisibility(isVisible) { 
    document.getElementById('actualControlID').style.display 
    = (isVisible ? "block" : "none"); 
    } 
+0

更喜歡它...... – PSL

+0

這太棒了,謝謝。將ClientIDMode設置爲靜態是否有缺點? – JosephStyons

+0

@JosephStyons,沒有缺點。我們都在爲這個問題而奮鬥,ASP.Net團隊在4.0中引入了這個解決方案。快樂編碼! –

相關問題