在编译时引用未知的ID

时间:2011-08-03 14:57:00

标签: asp.net

我正在建立一个用户控件,以便在一个地方收集我网站上弹出窗口的所有功能。当有人实例化控件时,他们将传入一个PopupID属性,该属性被分配给控件内div的id,并将用于在javascript中调用show()hide()函数。我将使用内容模板,以便可以通过不同类型的弹出窗口将不同的内容放入控件中。

弹出窗口的html看起来像这样:

<div id="<%=PopupID %>" class="popup box" runat="server">    
    <asp:PlaceHolder runat="server" ID="popupPlaceHolder"></asp:PlaceHolder>
</div>

然而,存在一个问题:asp.net习惯于在提供给客户端时为控件提供与您在html中编写的ID不同的ID。因此,该div的ID可能不是<%=PopupID%>它可能像#ctl00_whatever_<%=PopupID%>那样。通常我会通过以下方式解决这个问题:

<script type="text/javascript">
    var ddlCountry0 = '<%=ddlCountry0.ClientID%>';
    var ddlActivity0 = '<%=ddlActivity0.ClientID%>';
    var chkPrivateContacts = '<%=chkPrivateContacts.ClientID%>';;
</script>

在页面的标题中。然后,在引用javascript中的内容时,您只需$(ddlCountry0)而不是$('ddlCountry0')。但是,我不知道在这种情况下我怎么能这样做,因为我不知道元素的ID,直到有人实例化它。我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:1)

用户控件是否具有可以覆盖的CreateChildControls和OnPreRender方法?

如果在CreateChildControls期间添加了一个控件并且ID设置正确...在OnPreRender期间填充了ClientID属性,此时控件本身可以将必要的脚本块注入到正文或页眉中。人们经常使用jQuery来帮助解决这种情况:

headerScript.AddLine(“var ddlCountry0 = $('[ID $ =”&amp; Control.ClientID&amp;“]')。attr('id');”)

这是沿着正确的方向吗?

答案 1 :(得分:0)

最后,我使用ClientIDMode=Static来解决这些问题。