ContentPage的动态控件ID生成

时间:2012-03-31 17:54:15

标签: html webforms master-pages asp.net-4.0 content-pages

我坚持使用这个动态控件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

1 个答案:

答案 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;