我坚持使用这个动态控件ID生成,如果我在浏览器中呈现页面时,在<asp:Content></asp:Content>
内将我的控件(比如Button)放在ContentPage(由MasterPage继承)中,那么控件ID改变了,我读了ScottGu article on 'clientIDMode',我认为我的问题已经结束,所以我在'Web.Config'中设置'clientIDMode'
<pages clientIDMode="Static"></pages>
但问题仍然存在,我无法像这样从代码中引用我的控件,
//ctl00$Cntnt$Button1 name works but its dynamically created
if (ScriptManager1.AsyncPostBackSourceElementID == "Button1")
{
Label1.Text = "Async PostBack occured @ " + DateTime.Now.ToLongTimeString();
}
ASP.net标记:
<asp:Button ID="Button1" runat="server" Text="Refresh me" onclick="Button1_Click" />
浏览器端标记:
<input type="submit" name="ctl00$Cntnt$Button1" value="Refresh me" id="Button1" />
Q)我不能只使用我在标记中指定的控件的ID(好像我没有任何MasterPage)?
PS:在AsyncPostback上我想根据制作AsyncPostback的特定Button执行某些操作,为此,我必须检查来自AsyncPostBackSourceElementID
的值,不幸的是返回修改后的ControlID
答案 0 :(得分:1)
ClientIDMode
并不重要,因为AsyncPostBackSourceElementID
实际上是返回按钮的名称而不是ID。但是,您可以通过UniqueID
属性轻松获取按钮的名称:
if (ScriptManager1.AsyncPostBackSourceElementID == Button1.UniqueID)
{
//do whatever
}
我认为你误解了ClientIDMode
的目的。 ASP.NET生成的ID适用于客户端,在代码隐藏中,您仍然可以通过标记中分配给它们的ID访问控件。
<asp:Panel ID="Panel1" runat="server">
<asp:Label ID="Label1" runat="server" />
</asp:Panel>
呈现此项时,将使用您指定的ID和任何上升命名容器的ID的组合为每个控件生成唯一标识符(ClientID)。在这种情况下,Panel1
是命名容器,因此生成的ID将是:
<span id="ctl00_Panel1_Label1"></span>
但是,在代码隐藏中,您仍然可以通过分配给它的原始ID访问控件:
var labelText = Label1.Text;
生成的ID仅在客户端发挥作用,例如,您可能需要从JavaScript访问控件;然后,您可以让ClientID找到它。
var labelText = document.getElementById("<%=Label1.ClientID%>").innerText;