2012-11-27 65 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

相关问题