2012-11-27 64 views
0

我希望能夠在JavaScript函數中獲得ASP.NET控件的ClientID。我也希望能夠傳入包含控件名稱的var,以便不同的控件可以使用相同的函數。如何使用JavaScript變量在JavaScript函數中獲取ASP.NET ClientID?

例如,如果我想用一個名爲Button1控制,這工作得很好:

function doStuffToButton1Control() 
{ 
    var buttonControl = document.getElementById('<%= Button1.ClientID %>'); 
    //do stuff with buttonControl 
} 

,但我得到一個錯誤,當我試圖讓控件名稱動態。我想串起來ClientID的調用,就像這樣:

function doStuffToGenericControl(controlName) 
{ 
    var dynamicControl = document.getElementById('<%= ' + controlName + '.ClientID %>'); 
    //do stuff with dynamicContorl 
} 

我創建的字符串時使用雙引號或單引號試過,但錯誤總是「在字符串文字字符太多」或「字符文字中的字符太多」。控件存在且名稱正確傳遞(經alert(name)測試)。

有沒有更好的方法去解決這個問題,還是我錯過了明顯的東西?

謝謝!

更新:此功能將在母版頁上。任何數量的子頁面都會調用它。例如,一個孩子頁面可能有一個調用它像這樣的ASP控制:

<asp:LinkButton ID="Button2" runat="server" OnClientClick="doStuffToGenericControl('Button2')">...</asp:LinkButton> 

但另一個頁面可能有這樣的ASP控制也稱之爲:

<asp:LinkButton ID="Button4" runat="server" OnClientClick="doStuffToGenericControl('Button4')">...</asp:LinkButton> 

然而,這些控件的ID的經常由ASP.NET在渲染上進行更改,所以它們最終看起來像例如MainContent_Button2而不是僅僅Button2。爲了解決這個問題,我通常只使用<%= Button1.ClientID %>,但是因爲我想讓任何數量的控件能夠使用這個函數,所以我遇到了一些麻煩。

更新2:我能夠使用this以及getAttribute調用來獲得我所需要的。 (顯然,這隻會工作,當你指的是控制你點擊了一個,但是這是我所需要的),像這樣:

function doStuffToGenericControl(controlName) 
{ 
    var controlID = controlName.getAttribute('id'); 
    var control = document.getElementById(controlID); 
    //do stuff with control 
} 
+0

請提供更多的代碼,這種方法是如何被調用?你想傳遞給這個方法的是什麼論點? –

+0

一旦加載頁面,任何服務器端的C#代碼就完成了。任何服務器端的'<%%>'東西都被解析爲javascript函數的純文本(假設它實際上吐出了一些東西)。是否有理由不知道控制客戶端的實際ID? – Snuffleupagus

+0

請參閱上面的更新。謝謝! – rownage

回答

1

'<%= Button1.ClientID %>'的東西,與對照ID替換在ASP。淨頁面呈現,

但是當你在客戶端傳遞變量,你應該通過標識和使用它沒有任何%角鴞

所以試試這個

function getGenericControl(control) 
{ 
    var dynamicControl = control; 
    alert(dynamicControl); 
    //do stuff with dynamicContorl 
} 

UPDATE

你可以使用<%= ClientID%>爲上述方法生成參數,因此只需要像這樣更改OnClientClicks並使用上述方法

<asp:LinkButton ID="Button2" runat="server" OnClientClick="doStuffToGenericControl(this)">...</asp:LinkButton> 
+0

這將無法正常工作.net完成後搗毀編號 –

+0

尚不清楚,如何調用此功能,所以更多的代碼將使答案更清晰 –

+0

@ScottSelby是正確的......這是我的問題。我會更新我的問題。 – rownage

0

我強烈建議使用類,如果這是可能的,

var elems = document.getElementsByTagName('*'), i; 
    for (i in elems) { 
     if((' ' + elems[i].className + ' ').indexOf(' ' + matchClass + ' ') 
       > -1) { 
      elems[i].innerHTML = content; 
     } 
    } 
+1

rownage從來沒有提到jQuery ... – Snuffleupagus

+0

@Snuffleupagus - 該死的你是正確的,試圖回答快速編輯的答案 –

1

而不是通過控制名字你爲什麼不通過傳遞這樣的功能像這樣通過控制自身:

<asp:LinkButton ID="Button2" runat="server" OnClientClick="doStuffToGenericControl(this)">...</asp:LinkButton> 

,你的功能將是:

function getGenericControl(control) 
{ 
    var dynamicControl = control; 
    alert(dynamicControl.id); 
    //do stuff whatever you want with dynamicContorl 
} 
+0

是的,這幾乎是我最終根據ArsenMkrt的更新答案做的。我剛剛使用'getAttribute'而不是'dynamicControl.id' – rownage

相關問題