0

<asp:Content></asp:Content>この動的なコントロール ID の生成に行き詰まっています。ページがブラウザーでレンダリングされるときにコントロール (ボタンなど) を ContentPage (MasterPage によって継承される) に配置すると、コントロール 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" />

Q)マークアップで指定したコントロールの Id だけを使用することはできませんか (MasterPage がないかのように)?

PS: AsyncPostback では、 AsyncPostback を作成した特定の Button に基づいて特定の操作を実行したいので、AsyncPostBackSourceElementID残念ながら変更された ControlID を返す値を確認する必要があります

4

1 に答える 1

1

IDではなくボタンの名前を実際に返すため、これはClientIDMode問題ではありません。ただし、プロパティAsyncPostBackSourceElementIDを使用してボタンの名前を簡単に取得できます。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;
于 2012-03-31T18:27:31.603 に答える