【问题标题】:Issue getting .ClientID in ASP.NET C#在 ASP.NET C# 中获取 .ClientID 的问题
【发布时间】:2011-11-01 03:38:48
【问题描述】:

我在来自 AJAX 工具包的 AsyncFileUpload 的 uploadError javascript 函数中有以下内容:

function uploadError(sender, args) {
    document.getElementById("<%# uploadResult.ClientID %>").innerText = args.get_fileName(), "<span style='color:red;'>" + args.get_errorMessage() + "</span>";
}

不幸的是,ClientID 调用返回了Null,因此出现了 javascript 错误。

我还注意到,加载页面后,我的所有控件都没有通常的 .NET 格式:例如:

<asp:Label runat="server" Text="Select an image to upload it to this stock item...." ID="uploadResult" /> 

通常会这样渲染:

<span id="ctl00_ContentPlaceHolder1_uploadResult">Choose a webstock file to upload...</span>

但是对于这个文件,它呈现为:

<span id="uploadResult">Select an image to upload it to this stock item....</span>

我认为这是同一个问题,但不知道为什么会这样。

【问题讨论】:

  • 不确定是否复制粘贴,但检查实际代码中的runat="server"是否有任何拼写错误。这里看起来不错
  • 还要确保你把完整的结束标记放在
  • 所有runat属性都很好,完整的结局似乎没有什么区别。

标签: javascript asp.net ajax clientid


【解决方案1】:

问题是您使用的是 &lt;%# 语法,它只在绑定 (evals) 上执行。

您应该使用始终执行的&lt;%= 语法。

例如:

function uploadError(sender, args)
{
    document.getElementById('<%= uploadResult.ClientID %>').innerText = 
        args.get_fileName() + "<span style='color:red;'>" + 
        args.get_errorMessage() + "</span>";
}

Reference for more information on asp.net inline syntax.

Data-binding Syntax

Inline Syntax

编辑:请注意,您在分配给innerText 时使用了,,如果不是拼写错误,这也是一个问题。

【讨论】:

  • 不幸导致“控件集合无法修改,因为控件包含代码块”错误。
  • @Ben Drury 您何时/何时收到此错误?可能需要更多信息,因为听起来除了您提供的内容之外还有其他东西会导致该问题。不是我在答案底部发布的问题,因为您似乎也有错字,可能会导致奇怪的副作用。
【解决方案2】:
function uploadError(sender, args) {
    document.getElementById("<%= uploadResult.ClientID %>").innerText = args.get_fileName(), "<span style='color:red;'>" + args.get_errorMessage() + "</span>";

这样试试

【讨论】:

  • 不幸导致“控件集合无法修改,因为控件包含代码块”错误。
【解决方案3】:

为您的客户设置ClientIDMode="Static"

或在页面级别设置&lt;%@ Page ClientIDMode="Static"

【讨论】:

  • 嗨,我正在运行 .NET 3.5。如果我没记错的话,这个 4.0,不是吗?
【解决方案4】:

id 建议不要强制静态并限制其自身控件的 C# ASP 范围,id 而建议 转义特殊字符 像这样

document.getElementById('/</%= uploadResult.ClientID /%/>').innertext = "xyz or whatever";

如果需要,将其放入循环中并迭代每个函数 elementsArr 并将其更改为

document.getElementById('/</%= '+ elementsArr[x] +'.ClientID /%/>').innertext = "xyz or whatever";

但最好的解决方案是使用 sizzle (jquery) 搜索所有 id 以 ctl00 开头的元素,asp 元素默认情况下总是在前面添加 ctl00。

$("id^=ctl00").each(){

//使用this函数调用id到一个变量,然后用下划线(_)分割

//将最后一个值压入数组... 即所有下划线后的最后一项始终是真实ID。并且以这种方式使用嘶嘶声,您只能使用 asp 元素,这要归功于很棒的选择器,它是大声笑 - 代码更少,做更多。 });

我真的为速记道歉,但它深夜,我之前做过这个,它是我所知道的最稳定的选择,你不会通过修改标准细节来潜在地引起任何冲突。 (这样做总是不好的做法)

【讨论】:

    【解决方案5】:

    您可以将 ClientID 模式设置为静态,也可以尝试使用 UniqueID 而不是 ClientID。

    【讨论】:

    • 嗨,我使用的是 ASP.NET 3.5,所以 ClientIDMode 不可用。 :(
    猜你喜欢
    • 2013-04-15
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    相关资源
    最近更新 更多