0

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

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

function doSomething(objectId)
{
    ...
}

我有一个 .ascx 文件,其中包含一些 html 元素,并且在一个元素的 onclick= 中,我想调用 doSomething(),传递该 .ascx 文件中元素的 ID,其中传递的 ID 是一个元素以外的元素被点击,所以我不能使用“this.”。

也许举个例子会更清楚。

这有效:

<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>

当我查看源代码时,我看到没有发生 <%= %> 替换,而不是“doSomething('ctl00_myControl_top');” 我得到“doSomething('<%= top.ClientID %>');”

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

关于如何使这种替换起作用的任何想法?

4

2 回答 2

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>
于 2010-01-22T01:41:20.027 回答
0

考虑一条替代路线:

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

代码项目 - ASP.NET v4.0 客户端 ID 功能

除了将“ClientIDMode”说明符设置为“Static”外,我还发现了一个有用的想法,即将全局资源文件中的文本(在语言切换的情况下)放入不必在服务器级别。我在一个标准的 HTML 按钮上使用了它,该按钮应该调用一个显示/隐藏特定 div 或 ASP 面板的 JavaScript 函数。在内联表达式标签中使用 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 时它很受欢迎。我希望这可以帮助别人!

于 2014-02-27T14:45:54.067 回答