在事件字符串中扩展ClientID

时间:2010-01-22 01:33:35

标签: asp.net javascript clientid

我遇到了<%= obj.ClientID%>的问题扩展,在.ascx用户控件中。

我有一个.js文件,其中包含一个javascript函数:

function doSomething(objectId)
{
    ...
}

我有一个.ascx文件,带有一些html元素,并且在一个元素的onclick =我想调用doSomething(),传递该.ascx文件中元素的ID,其中传递的ID是其他元素比点击的那个,所以我不能用“这个。”。

也许用一个例子会更清楚。

这有效:

<script type="text/javascript">
    function redirect()
    {
        doSomething('<%= top.ClientID %>');
    }
</script>
<div id="top" runat="server">
    <img src="..." alt="..." onclick="redirect();"/>
</div>

但这不是:

<div id="top" runat="server">
    <img src="..." alt="..." onclick="doSomething('<%= top.ClientID %>');"/>
</div>

当我查看来源时,我看到&lt;%=%&gt;替换没有发生,而不是“doSomething('ctl00_myControl_top');”我得到“doSomething('&lt;%= top.ClientID%&gt;');”

出于某种原因,脚本扩展发生在前一种情况,而不是后一种情况。当然,解决方法是不可接受的,因为如果我在页面上包含控件的多个副本,它将会中断 - 只有一个实例的“redirect()”函数可以访问。

有关如何进行此替换的任何想法都有效吗?

2 个答案:

答案 0 :(得分:2)

在我的机器上工作?

<div id="top" runat="server">
    <a href="#" onclick="doSomething('<%= top.ClientID %>')">rarrarara</a>
</div>

变为

<div id="ctl00_ContentPlaceHolder1_top">
    <a href="#" onclick="doSomething('ctl00_ContentPlaceHolder1_top')">rarrarara</a>
</div>

答案 1 :(得分:0)

考虑替代路线:

确保您使用内联表达式<%= (controlName).ClientID %>在JavaScript中引用的控件具有其“ClientIDMode”&#39;说明符设置为静态值,然后只需使用该控件的ID字段中的文本来引用它。我最近在一个最近很好的项目中使用它。请参阅以下链接以获取更详细的说明:

Code Project - ASP.NET v4.0 Client ID Feature

设置&#39; ClientIDMode&#39;对于&#34; Static&#34;的说明符,我发现了一个有用的想法,即将文本从全局资源文件(在语言切换的情况下)放入标准HTML控件的字段中,而不必在服务器级别运行。我在一个标准的HTML按钮上使用它,该按钮应该调用一个JavaScript函数来显示/隐藏特定的div或ASP Panel。在内联表达式标记中使用GlobalResource函数,如下所示:

<input id="btnToggleFilterOptions" type="button" value="<%=GetGlobalResourceObject("SiteResource", "btnToggleFilterOption")%>" onclick="javascript:ToggleCssClass('divFilterOption','visible'); return false;" class="button submit" />

<asp:Panel ID="divFilterOption" ClientIDMode="Static" runat="server">
    <asp:TextBox ID="txtFilterOption1" runat="server" />
</asp:Panel>

我知道这是一篇旧帖子,但在Google上搜索Asp .NET和ClientID时,它很受欢迎。我希望这有助于其他人!