我有一个asp.net usercontrol(.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
)
由于将动态填充用户控件,因此我无法始终知道实例的名称。
有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
由于您使用id
HiddenField1
不再是runat=server
document.getElementById('<%=HiddenField1.ClientID %>').value = windowResult;
答案 1 :(得分:1)
修改强>
无法修改Controls集合,因为该控件包含代码块(即&lt;%...%&gt;) 由于此原因发生错误
<head id="head1" runat="server">
<script>
document.getElementById('<%=HiddenField1.ClientID %>').value = windowResult;
</script>
</head>
将runat =“server”属性添加到标记时,运行时会将其视为HtmlHead控件。
修改强>
您在评论中提供的错误的解决方案
从页面的head部分删除了JavaScript并将其添加到页面正文中并使其正常工作
它将是
document.getElementById('<%=HiddenField1.ClientID %>').value = windowResult;
因为隐藏字段在服务器端,您需要获取该字段的客户端ID以获取您的javascript中的值..
如果您使用的是Asp.net 4.0版本,请查看以下内容:ASP.NET 4.0 Client ID Feature
Control.ClientIDMode属性 - 获取或设置用于生成ClientID属性值的算法。
<强>自动识别强> ClientID值是通过将每个父命名容器的ID值与控件的ID值连接而生成的。在呈现控件的多个实例的数据绑定方案中,将在控件的ID值前插入递增值。每个段由下划线字符(_)分隔。此算法用于早于ASP.NET 4的ASP.NET版本。
<强>静态强> ClientID值设置为ID属性的值。如果控件是命名容器,则该控件将用作其包含的任何控件的命名容器层次结构的顶部。
<强>可预测的强> 此算法用于数据绑定控件中的控件。 ClientID值是通过将父命名容器的ClientID值与控件的ID值连接而生成的。如果控件是生成多行的数据绑定控件,则会在末尾添加ClientIDRowSuffix属性中指定的数据字段的值。对于GridView控件,可以指定多个数据字段。如果ClientIDRowSuffix属性为空,则在末尾添加序号而不是数据字段值。此数字从零开始,每行增加1。每个段由下划线字符(_)分隔。
<强>继承强> 该控件继承其NamingContainer控件的ClientIDMode设置。
答案 2 :(得分:0)
你应该像这样使用ClientID
document.getElementById("<%= HiddenField1.ClientID %>").value = windowResult;
您应该始终使用ClientID,因为根据服务器控件所在的容器,客户端上的ID不同。
答案 3 :(得分:0)
我的印象是客户端ID只会被分配给具有runat =“server”属性的IE控制器,但无论如何你可以使用该属性 的ClientIDMode = “静态” 将ClientID设置为始终是您指定的那个或 的ClientIDMode = “预测” 将ClientID设置为服务器生成但始终相同