3

最近、.NET 3.5SP1 から .NET 4.5 にアップグレードしました。INamingContainer インターフェイスを使用するコントロールが ClientID を異なる方法でレンダリングするようになったことがわかりました。

MS のドキュメントによると、INamingContainer はコントロールの階層内に新しい ID 名前空間を作成します。

古い動作では、ID は次のようになります。

<input id="MyContainer_txtName" />

しかし、次のようになります。

<input id="ctl00_ctl00_c_contentHolder_MyContainer_txtName" />

ct100 プレフィックスとコンテンツ ホルダー コントロール名が含まれています。

これを使用するクラスの例は次のようになります。

public class MyTextBox : System.Web.UI.WebControls.TextBox, INamingContainer
{

}

ClientIDMode="AutoID"下位互換性を設定しています。

以前のように、各コントロールに正しい ID を手動で与えることもできClientID="static"ましたが、これを完了するには多くの作業が必要です。

INamingContianer が以前のバージョンの .NET のようにレンダリングされない理由を理解したいと思います。

前もって感謝します。

4

2 に答える 2

2

重大な変更は .NET4 にありました。

ClientIDModeASP.NET 4の設定では、ASP.NET が HTML 要素の id 属性を生成する方法を指定できます。以前のバージョンの ASP.NET では、既定の動作は の AutoID 設定と同等でし ClientIDModeた。ただし、デフォルト設定はPredictableになりました。

Visual Studio 2010 を使用してアプリケーションを ASP.NET 2.0 または ASP.NET 3.5 からアップグレードする場合、ツールは、以前のバージョンの .NET Framework の動作を維持する設定を Web.config ファイルに自動的に追加します。ただし、IIS のアプリケーション プールを .NET Framework 4 を対象とするように変更してアプリケーションをアップグレードすると、ASP.NET は既定で新しいモードを使用します。新しいクライアント ID モードを無効にするには、Web.config ファイルに次の設定を追加します。

<pages ClientIDMode="AutoID" / >
于 2013-01-17T12:03:19.133 に答える
1

この記事で説明されているように、Predictable および Static ClientModeID を使用してこれを修正することができました。

それを解決するのに役立つビットは終わりに近づいています。

予測可能な設定を使用する場合の親の名前付けコンテナーの影響

....

GridView の ClientIDMode を Predictable に設定すると、自動生成された ID が削除され、行インデックスまたは指定されたデータ フィールド値が追加され、次のような ID になります。

ContentPlaceHolder1_UserControlID_GridViewID_lblName_0 ContentPlaceHolder1_UserControlID_GridViewID_lblName_1 ContentPlaceHolder1_UserControlID_GridViewID_lblName_2 ...

ContentPlaceHolder ID がまだレンダリングされた ID の一部であることに注意してください。ユーザー コントロールの ClientIDMode を Static に設定することで、id のこの部分を省略できます。これは、ユーザー コントロールの @Control ディレクティブを介して行うことができます。これにより、次のような ID が生成されます。

UserControlID_GridViewID_lblName_0 UserControlID_GridViewID_lblName_1 UserControlID_GridViewID_lblName_2
...

于 2013-01-24T21:21:08.987 に答える