0

我被这个动态控件 ID 生成所困扰,如果我将我的控件(比如按钮)放在 ContentPage (由 MasterPage 继承)中,<asp:Content></asp:Content>当页面在浏览器中呈现时,控件 ID 会更改,我阅读了ScottGu 上的文章'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" />

问)我不能只使用我在标记中指定的控件的 ID(好像我没有任何 MasterPage)?

PS:在 AsyncPostback 上,我想根据特定的 Button 执行某些操作 AsyncPostback ,为此我必须检查AsyncPostBackSourceElementID不幸返回修改后的 ControlID的值

4

1 回答 1

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>

呈现时,将为每个控件生成一个唯一标识符 (ClientID),使用您分配的 ID 和任何高级命名容器的 ID 的组合。在本例Panel1中是命名容器,因此生成的 ID 将是:

<span id="ctl00_Panel1_Label1"></span>

但是,在代码隐藏中,您仍然可以通过分配给它的原始 ID 访问控件:

var labelText = Label1.Text;

生成的 ID 仅在客户端发挥作用,例如,您可能需要从 JavaScript 访问控件;然后您可以通过 ClientID 找到它。

var labelText = document.getElementById("<%=Label1.ClientID%>").innerText;
于 2012-03-31T18:27:31.603 回答