ASP.NET WebControlから継承して、いくつかの機能を追加しました。空白のASP.NETWebサイト([ファイル]> [新しいWebサイト...]で作成)でコントロールをテストしましたが、正常に機能しました。しかし、Webアプリケーションプロジェクトに追加すると機能しません([ファイル]>[新しいプロジェクト...]>[Visual Basic]> [Web]> [ASP.NET Webアプリケーション]で作成しました。個人的には、開発を容易にするためにWebサイトを好みます。しかし、私が現在取り組んでいるプロジェクトリーダーシップは、それをWebアプリケーションのままにしておきたいと考えています(すべてのページコードビハインドをBinフォルダー内の単一のDLLにプリコンパイルする方法が好きです)。
問題を特定するために、簡単なMSDNウォークスルー:カスタムサーバーコントロールの開発と使用を使用して問題を再現しようとしました。驚いたことに、同じ問題が発生しました。ASP.NETWebアプリケーションプロジェクトにビルドし、ページのコードビハインドからコントロールのインスタンスにアクセスしようとすると、コンパイルエラーBC30456が発生します。'WelcomeLabel1 'は'WebApplication1._Default'のメンバーではありません。たとえば、ページの読み込みで次のように記述します。
Me.WelcomeLabel1.Text = "foo"
ただし、そのコード行を単に削除すると、正しくコンパイルされ、ブラウザにラベルが正しくフォーマットされたページが表示されます。私にとって、これはコンパイラ/フレームワークのバグです。コントロールがページに適切に挿入された場合、それは常にコードビハインドで利用可能であるはずですよね?
何か案は?ウォークスルーでさらに提案されているように、コントロールをアセンブリにコンパイルできると思いますが、それはやり過ぎのようです。
興味深いことに、FindControlを使用してWelcomeLabelへの参照を取得できますが、適切なタイプにキャストできません。これを行うと、「タイプ'Samples.AspNet.VB.Controls.WelcomeLabel'のオブジェクトをタイプ'WebApplication2.Samples.AspNet.VB.Controls.WelcomeLabel'にキャストできません」というエラーが発生します。考えられる名前空間とインポートのすべての組み合わせを試しましたが、designer.vbファイルに手動で宣言を追加することもできましたが、もちろんWebサイトプロジェクトに切り替えない限り、これを機能させることはできません。できません。
アップデート1.1:
明確にするために、私が達成しようとしていたことは次のとおりでした。
- Webアプリケーションプロジェクト
- 同じアセンブリ内の継承されたWeb制御クラスファイル(つまり、別のコンパイル済みDLLから参照されていない)
- デザイン時のマークアップを通じてページに追加されたコントロール
- ページコードビハインドから参照されるコントロールインスタンス
編集:ブライアンのコメントを読み直した後、私はついに理解しました。実際には非常に簡単です。マークアップの<%@ Register%>ディレクティブにAssembly = "WebApplication1"を追加し、「WebApplication1」を追加するだけです。名前空間ディレクティブのプレフィックス。それで:
<%@ Register Assembly="WebApplication1" TagPrefix="aspSample" Namespace="WebApplication1.Samples.AspNet.VB.Controls" %>
これで、コントロールのクラスファイルをApp_Codeに配置する場合でも、他の場所に配置する場合でも、マークアップを介してコントロールをインスタンス化し、コードビハインドからインスタンスにアクセスすることに問題はありません。
ジョーダン・リーガー