ホームページ  >  記事  >  バックエンド開発  >  ASP.net でコントロールを動的に読み込むときの問題の概要

ASP.net でコントロールを動的に読み込むときの問題の概要

巴扎黑
巴扎黑オリジナル
2016-12-20 14:00:371134ブラウズ

ASP.net で動的コントロールを使用しないようにと言っている人をよく見かけますが、その主な理由は、プロジェクトを実行する過程で、コントロールの動的読み込みについて常に質問することです。簡単な概要。
1. LoadControl を使用してコントロールを読み込んだ後、ユーザー コントロールの一部のコントロールがイベントに応答しなくなります。
この問題は主に、コントロールの読み込みを if (!Page.IsPostBack) の内側に配置し、それを外側に配置することで発生します。この問題については、Sigui のブログで詳しく説明されています。
2. ユーザー コントロールの一部のコントロールの応答に問題があります。たとえば、ボタンが初めて選択されたときは CLICK イベントがトリガーされませんが、2 回目には正常にトリガーされます。
これは、コントロールに ID が設定されていないことが原因です。コントロール ID の機能については、以下で詳しく説明します。 たとえば、
Control userControl=(Control)Page.LoadControl("Test.ascx");
AddControl(userControl);
3. ユーザー コントロールに DataGrid コントロールが含まれている場合、 DataGrid イベントに応答しないという問題が発生する可能性があります。
これはバグのようです。次のように、ロードされたコントロールを強制的に変換する必要があります。
Test userControl=(Test)Page.LoadControl("Test.ascx");
注: 上記では、Control ではなく Test タイプが使用されています。 !
この問題については、以前のブログで説明しましたが、このアプローチではシステムのスケーラビリティが低下します。 (戦略パターンを使用して) 話し合う解決策があります:
public class BaseControl: System.Web.UI.UserControl
{
public virtualBaseControl ProcessThisControl();

}
Datagrid コントロールがある場合、すべてのユーザー コントロールは BaseControl から継承します。次のような ProcessThisControl メソッドをオーバーライドします。
これを Test として返します。
BaseControl userControl=(BaseControl)Page.LoadControl("Test.ascx");
userControl.ProcessThisControl();

4 . ユーザー コントロールで JavaScript を使用する方法。
クライアント側スクリプトを使用すると、ページの応答速度が大幅に向上し、頻繁なページ更新が回避されることは誰もが知っています。したがって、JavaScript を使用してページに部分コントロールを実装する方が良い方法ですが、ユーザー コントロール内の特定のサブコントロールにアクセスする場合はどうなるでしょうか?

次のように使用します: document.all.<%= TestControl.ClientID%>.disabled=true; //TestControl を無効に設定します
C# スクリプトの場合次のように記述する必要があります: Page.RegisterStartupScript("OnInitControl",""); , TestControl ユーザー コントロールの子コントロールとして。

次に、コントロール ID について説明します。aspx ファイルにアクセスすると、IIS は aspx スクリプトをコンパイルします。コンパイル時に、ユーザー コントロールのコンテンツを同じページに記述します。ページ内のコントロールがユーザー コントロール内のコントロールと同じ名前を持つことを避けるために、ユーザー コントロール内のコントロール名を次のように変更します。 : サブコントロールの場合、コントロール ID はユーザーコントロール ID_子コントロール ID に変更されます。 コントロールを動的にロードする場合、コントロールの ID が割り当てられていない場合、コントロール ID は最後にロードされたコントロールのコントロール ID となるため、ユーザー コントロールがロードされた直後に ID を設定する必要があります。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。