从外部javascript文件获取用户控件的clientid

时间:2010-03-23 12:58:25

标签: c# asp.net javascript jquery user-controls

我在ASP.NET中开发一个用户控件(ascx),它使用javascript来操作控件。目前,javascript代码已内联,并使用<%= somecontrol.ClientID %>来获取所需的控件。

我想将javascript文件放在外部文件中,但是从外部文件我不能使用上面的语法来检索控件。我已经阅读了thisthis答案中可能的解决方案,但问题是用户控件可以在页面上多次放置。这意味着Controls数组(在答案中提到)将使用不同的项目多次呈现。因此,脚本将无法检索所需的ID。如果我将<%= ClientId %>放在包含项目的数组的名称中,那么我将遇到与我试图解决的问题相同的问题。

有什么想法吗?

4 个答案:

答案 0 :(得分:4)

好的,一种不同的方法,我尝试使用JavaScript类样式,然后为每个控件初始化它。

在外部javascript文件中,将代码编写为:

function oNameCls(ControlId1) {

    this.ControlId1 = ControlId1;

    this.DoYourWork1 = function() {
        // use the control id.
        // this.ControlId1
    }    
    this.DoYourWork2 = function() {
        // use the control id.
        // this.ControlId1
    }    

}

在控制器上进行这样的调用。

<script language="Javascript" type="text/javascript">
    // init - create
    var <%=this.ClientID%>MyCls = new oNameCls(<%=Control1.ClientID%>);
    // do your work
    <%=this.ClientID%>MyCls.DoYourWork1();
</script>

希望现在有所帮助。

答案 1 :(得分:2)

我解决这个问题的方法是使用CSS类或将控件放在具有已知ID的容器中,然后遍历容器的子节点以获取实际控件。例如:

<asp:TextBox ID="Something" runat="server" CssClass="mycontrol" ... />

可以通过以下方式访问:

jQuery('.mycontrol');

或者:

<div id="ControlContainer">
    <asp:TextBox ID="Something" runat="server" ... />
</div>

可以通过以下方式访问:

jQuery("#ControlContainer input[type='text']");

这种方法唯一真正的问题是你将代码绑定到页面上的特定标记,如果标记发生很大变化,这可能会很麻烦。

答案 2 :(得分:1)

隐藏变量怎么样:

<input type="hidden" id="ClientId" value="<%=ClientId %>">

然后从你的js:

$("#" + $("#ClientID").val())

或者,将哈希值放在:

<input type="hidden" id="ClientId" value="#<%=ClientId %>">

...

$($("#ClientID").val())

答案 3 :(得分:0)

如果要在可能有多个副本时找到特定控件,则无法执行此操作。外部JavaScript如何知道您想要哪个n控件?

如何将行为归结为类并找到相对于动作控件位置的元素,如下所示:

用户控件:

<div class="myControl">
  <asp:Button id="MyButton" runat="server" Text="Click Me" />
  <div style="display:none;">Show me!</div>
</div>

如果你把jQuery写成这样的亲戚:

$(".myControl input").click(function() {
  $(this).next().slideDown();
});

在这种情况下,只要您可以相对于您需要的控件导航DOM,具体ID是什么并不重要。即使它比.closest("div").next().find(".bob").prev()更复杂......无论你需要什么,都可以。