0

リフレクションを使用して Web フォームに存在するコントロールのプレーン テキスト リストを取得することは可能ですか? 基本的に、同僚は検証戦略を定義するのに役立つコントロールのリストを取得しようとしています。たとえば、一般に製品番号は数字でなければなりませんが、特定の画面では英数字にすることができます。リフレクションを使用して次のようなリストを生成するのは簡単だと思いました。

AddProduct.aspx
     txtProductNumber
     txtProductName
     etc.

フォーム名は取得できますが、これまでのところ含まれているコントロールは取得できません。現在のコードは次のようになります。

Assembly assembly = Assembly.LoadFrom(@"Filename.dll");
Type[] types = assembly.GetExportedTypes();
for (int i = 0; i < types.Length; i++)
{
    Page page = (Page)assembly.CreateInstance(types[i].FullName);
    ControlCollection controls = page.Controls;
    // At this point controls.Count = 0 presumably because the controls are defined as protected.
}


Assembly.CreateInstanceには、いくつかのオーバーロードがあります。たとえば、ページ割り当て行を

ページ ページ = (ページ)assembly.CreateInstance(types[i].FullName, true, BindingFlags.NonPublic, null, null, null, null);

次に、コンストラクターが見つからないというエラーが発生します。

それで、私は完全に間違った道を進んだのでしょうか、それとも私がやろうとしていることは実際にはまったく可能ですか? どんな助けでも大歓迎です。

編集:この質問への回答が遅れたことをお詫びします。Assembly.GetCallingAssembly() を使用してリストを生成する方法を少し進めましたが、まだニーズを完全には満たしていませんでした。最終的には、ソリューション全体を検索する、より長い時間をかけたアプローチを使用しました。

4

2 に答える 2

2

各ページのインスタンスを作成しているだけで、実際にページを提供していないため、ページとその作成を担当する通常のページ要求ライフサイクルをページが通過しないため、このアプローチが機能するとは思わない子コントロール。

これが asp.net フレームワーク コントロールを使用する単一の Web サイトである場合は、タグ プレフィックス "

于 2011-08-12T11:30:02.280 に答える
1

実行時に作成されるコントロールを探しているようです。実行時にこれらのコントロールを見つけたい場合は、リフレクションと(コンテナーに応じて)他の手段の両方で見つけることができます。Page_Unloadほとんどのコントロールがロードされ、引き続き使用できるイベントでこれを行う必要があります。

ただし、ページ要求のライフサイクルを通じてページを処理せずにこれらのコントロールを見つけようとすると、気が遠くなる可能性があります。CreateInstance(または「new」)を使用してページを作成するだけでは、実行されないか、その他のイベントは実行されませPage_LoadPage_Init。コンストラクターでコードを実行するだけです(これは保護されているため、インスタンス化できないわけではありませんが、その問題を経験してもほとんど効果がありません)。

于 2011-08-12T11:37:04.613 に答える