我遇到了<%= 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()”函数可以访问。
有关如何进行此替换的任何想法都有效吗?
答案 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时,它很受欢迎。我希望这有助于其他人!