コントロールを作成するとき、以下に示すように、「コントロールのレンダリング中にエラーが発生しました」や「ハンドルされない例外が発生しました。オブジェクト参照がオブジェクトのインスタンスに設定されていませんでした。」などのエラーが発生しやすくなります。 runat が ="server" タグに設定されていないだけでこのエラーが発生する可能性もあります。最初にこの項目を確認してください)
ただし、コンパイル時/実行時にはエラーは発生しません。
分析
図に示されている状況を、「コンパイル時」/「実行時」と区別するために「デザイン時」と呼びます。
デザイン時: ASP.NET 環境では、Web デザイナーを使用して Visual Studio で編集します。直接的に理解できるのは、ASPX ページが「デザイン」に切り替わったときです。
コンパイル時: 直接理解すると、コンパイル時のエラーは通常、型チェックやパラメーターの一致などの構文制約によって明示的に制限できるエラーです。
実行時: 直接理解できるのは、プレビュー/実行するときです。通常、このときのエラーは、特定の例外と論理エラーで構成されます。
コントロールの設計中にコントロールのパフォーマンスを分析してみましょう。コントロールが設計されると、VS は実行時に出力コントロールの外観をインテリジェントにシミュレートし、特定のメソッド シーケンスを通過し、最終的に現在の出力を形成します。標準によれば、コントロールの出力操作は Render または RenderContents で実行する必要があります (実際には、他の操作も可能ですが、通常は実行しません。そうしないと、「コントロールのレンダリング時のエラー」例外が主に Render または RenderContents から発生します)。レンダリングコンテンツ)。
「オブジェクト参照がオブジェクトのインスタンスに設定されていません。」というエラー メッセージから判断すると、オブジェクトの 1 つ以上のインスタンスが初期値を割り当てずに使用されているということになります。
コードを覗いてみましょう:
protected override void RenderContents(HtmlTextWriter writer) { UpButton.Text = Page.Server.HtmlDecode(UpButton.Text); DownButton.Text = Page.Server.HtmlDecode(DownButton.Text); base.RenderContents(writer); }
設計時にコントロールには上ボタンと下ボタンが必要なので、上と下にそれぞれ 2 つの特別な句読点が必要です。この 2 つの記号は、以下に示すようにコード番号を設定することで、ブラウザーで正しく表示されるようになります:
private string upButtonText = "∧"; private string downButtonText = "∨";
ただし、これら 2 つのシンボルは出力される前にページ上の HtmlEncode メソッドによってコンパイルされ、これら 2 つの特別なマークは直接出力を通じてのみ表示されます。これは、HtmlEncode の後、特殊マークは上下の矢印を出力せずに、テキスト ∧ ∨ の形式でのみ出力できることを意味します。この時点で、デコードのためにその逆メソッド Page.Server.HtmlDecode を導入する必要があります。このインスタンスは、ページが実際に存在する場合にのみ null になることに注意してください。それ以外の場合は、以降の操作が null になります。このような操作を行うと、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが表示されます。
設計時: 先ほど述べたように、設計時はページのレンダリングのプロセスをシミュレートするだけであり、ページは実際には存在しません。したがって、この時点では Page オブジェクトのインスタンスは空になり、後続の呼び出しでは例外がスローされます。
現在必要な動作を処理するメソッドがこのメソッドのみであると仮定すると、Page を呼び出すと、間違いなく null オブジェクトが生成され、後続の操作で例外が発生します。ここで、「デザイン モード」の概念を導入します (DesignPattern ではなく DesignMode)。DesignMode は、コンポーネントが現在デザイン モードであるかどうかを示す値を取得する Control クラスの保護されたプロパティです。ここでいうデザインパターンとは、デザインの概念に相当する。
そのため、コードを次の形式に変換できます:
protected override void RenderContents(HtmlTextWriter writer) { if (!DesignMode) { UpButton.Text = Page.Server.HtmlDecode(UpButton.Text); DownButton.Text = Page.Server.HtmlDecode(DownButton.Text); } base.RenderContents(writer); }
このようにして、設計時以外の場合にのみ Page オブジェクトのインスタンスを導入するため、設計時の例外は簡単に解決されます。
まとめ
したがって、コントロールを設計するとき、特にコントロールのプレゼンテーションを検討するときは、同様の例外を回避するために、リソースの取得に失敗した項目について、コントロールが設計中に十分なリソースを取得できることを考慮する必要があります。それらを明示的に区別する必要があります (上記のコードのように、DesignMode は、設計時に実行されるコードであるかどうかを判断するために使用されます)。
拡張
先ほど見た状況は、設計中に特定のインスタンスを参照できないことによって引き起こされる例外に起因する可能性があります。これには、データベース/ファイル システムの読み取り、初期値のない変数、およびページのようなプロパティの呼び出しが含まれます。 Session、Page.Request.QueryString などが追加されます。ページを設計するとき、上記のソリューションの一部、特にページに呼び出される関連メソッドは常に存在するため、コントロールを設計するときにそれらの例外が発生することはあまりありません。
以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。また、皆さんも PHP 中国語 Web サイトをサポートしていただければ幸いです。
VS2010 でコントロールをレンダリングする際のエラーの解決策に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。