1

我有一个asp.net 用户控件(.ascx)。用户控件有一个 HTML 隐藏字段。

<input id="HiddenField1" type="hidden" runat="server" />

用户控件触发一个 HTML 窗口弹出,用户在弹出窗口中输入几个值,然后在弹出窗口关闭后,一个字符串值保存在该隐藏字段中。

document.getElementById("HiddenField1").value = windowResult;

最后,用户控件的后端代码通过从隐藏字段中提取字符串值来完成一些任务。

string[] nameValuePair = new string[2];
nameValuePair = HiddenField1.Value.Split('%');   

问题是 document.getElementById("HiddenField1") 在执行时失败。因为当我在网页中使用用户控件时,控件的 ID 变为[my usercontrol name] + $ + [hidden field name]. (例如。ctrl_TaxonomyTree1$HiddenField1

由于用户控件将被动态填充,我不能总是知道实例的名称。

有没有办法解决这个问题?

4

4 回答 4

1

id不再是HiddenField1因为你使用runat=server

document.getElementById('<%=HiddenField1.ClientID %>').value = windowResult;
于 2012-05-04T11:02:55.387 回答
1

编辑

由于控件包含代码块(即 <% ... %>) ,因此无法修改 Controls 集合

<head id="head1" runat="server">
  <script>
   document.getElementById('<%=HiddenField1.ClientID %>').value = windowResult; 
  </script>    
</head>

当您将 runat="server" 属性添加到标记时,运行时会将其视为 HtmlHead 控件。

编辑

您在评论中提供的错误的解决方案

从页面的头部删除 JavaScript 并将其添加到页面的主体并使其正常工作

检查:错误文章

这将是

document.getElementById('<%=HiddenField1.ClientID %>').value = windowResult; 

因为在隐藏文件中是在服务器端,你需要获取文件的客户端 ID 才能在你的 javascript 中获取值。

对于 Asp.net 4.0

如果您使用的是 Asp.net 4.0 版本,请查看以下内容:ASP.NET 4.0 Client ID Feature

Control.ClientIDMode 属性- 获取或设置用于生成 ClientID 属性值的算法。

AutoID ClientID 值是通过将每个父命名容器的 ID 值与控件的 ID 值连接起来生成的。在呈现控件的多个实例的数据绑定方案中,将在控件的 ID 值前面插入一个递增值。每个段由下划线字符 (_) 分隔。此算法在早于 ASP.NET 4 的 ASP.NET 版本中使用。

静态 ClientID 值设置为 ID 属性的值。如果控件是命名容器,则该控件用作它所包含的任何控件的命名容器层次结构的顶部。

可预测 此算法用于数据绑定控件中的控件。ClientID 值是通过将父命名容器的 ClientID 值与控件的 ID 值连接起来生成的。如果控件是生成多行的数据绑定控件,则在末尾添加 ClientIDRowSuffix 属性中指定的数据字段的值。对于 GridView 控件,可以指定多个数据字段。如果 ClientIDRowSuffix 属性为空,则在末尾添加序号,而不是数据字段值。这个数字从零开始,每行加 1。每个段由下划线字符 (_) 分隔。

Inherit 控件继承其 NamingContainer 控件的 ClientIDMode 设置。

于 2012-05-04T11:04:09.253 回答
0

你应该使用 ClientID,像这样

document.getElementById("<%= HiddenField1.ClientID %>").value = windowResult;

您应该始终使用 ClientID,因为客户端上的 ID 根据服务器控件所在的容器而有所不同。

于 2012-05-04T11:03:31.140 回答
0

我的印象是客户端 ID 只会分配给具有 runat="server" 属性的服务器控件 IE,但无论如何您可以使用属性 ClientIdMode="Static" 将 ClientID 设置为始终是您指定的那个或ClientIDMode="Predictable" 将 ClientID 设置为服务器生成但始终相同

于 2012-05-04T11:04:23.793 回答