4

ClientIdMode に関する MSDN ドキュメントの状態:

静的 ClientID 値は、ID プロパティの値に設定されます。コントロールが名前付けコンテナーである場合、そのコントロールは、それに含まれるすべてのコントロールの名前付けコンテナーの階層の最上位として使用されます。

ソース: http://msdn.microsoft.com/en-us/library/system.web.ui.control.clientidmode%28v=vs.100%29.aspx

しかし、私は「階層のトップ」ビジネスが当てはまるとは思いません。たとえば、私はユーザーコントロールを持っています:

<uc1:WidgetsListControl runat="server" id="WidgetsListControl" ClientIDMode="Static"  />

適切な測定のために、コントロール ソースにも clientidmode を設定しましたが、どちらが必要かはわかりません。

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WidgetsListControl.ascx.cs" Inherits="WebApplication1.WidgetsListControl" EnableViewState="false" ClientIDMode="Static" %>

ユーザー コントロール内に、テキスト ボックスがあります。

<asp:TextBox ID="testTextBox" runat="server" />

私の期待は、テキストボックスの名前が次のようになることですWidgetsListControl$testTextBox

ただし、ソースを表示すると次のようになります。

<input name="ctl00$MainContent$WidgetsListControl$testTextBox" id="testTextBox" type="text"/>

私は何が欠けていますか?ユーザーコントロール内のすべてのコントロールに「静的」を設定せずに、探しているもの(短いID)を達成する方法はありますか?

編集:

実際に詳しく調べてみると、ID 属性は MSDN で説明されているとおりに機能していることがわかりましたが、name 属性は依然として名前付けコンテナー階層の完全な連結です。

非常に複雑なサイトでは、これらのコントロールの名前と ID が帯域幅 (マークアップ サイズ) の大部分を占め始めます。この点に関して、マークアップをスリム化するための適切な回避策が見つからないようです。

4

2 に答える 2

1

このコントロールは、Panel または何か内にある必要がrunat="server"あり、カスタム コントロール自体は、その子の名前付けコンテナーです。識別子を変更せずに名前を付けたい場合は、Predictable(IIRC) クライアント ID モードを使用する必要があります。

注:Predictableこれに関するドキュメントを見るとそうではないように見えますが、ASP.NET で「クリーンな」.NET 識別子を取得するために常に使用してきたものだと確信しています。

さらに、ClientIDMode をグローバルに適用する場合は、<pages>要素の属性で web.config ファイルに指定します。

于 2013-05-30T15:48:48.407 に答える