2

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:

明確にするために、私が達成しようとしていたことは次のとおりでした。

  1. Webアプリケーションプロジェクト
  2. 同じアセンブリ内の継承されたWeb制御クラスファイル(つまり、別のコンパイル済みDLLから参照されていない)
  3. デザイン時のマークアップを通じてページに追加されたコントロール
  4. ページコードビハインドから参照されるコントロールインスタンス

編集:ブライアンのコメントを読み直した後、私はついに理解しました。実際には非常に簡単です。マークアップの<%@ Register%>ディレクティブにAssembly = "WebApplication1"追加し、「WebApplication1」を追加するだけです。名前空間ディレクティブのプレフィックス。それで:

<%@ Register Assembly="WebApplication1" TagPrefix="aspSample" Namespace="WebApplication1.Samples.AspNet.VB.Controls" %>

これで、コントロールのクラスファイルをApp_Codeに配置する場合でも、他の場所に配置する場合でも、マークアップを介してコントロールをインスタンス化し、コードビハインドからインスタンスにアクセスすることに問題はありません。

ジョーダン・リーガー

4

2 に答える 2

1

あなたは何か奇妙なものを持っています。確認すべき点がいくつかあります...

1つは、コードにCodeFileディレクティブが含まれていないことを確認します。ページクラスと同じアセンブリにコンパイルする必要があります。Inheritsディレクティブが正しいことを確認してください。自分が思っているクラスではないクラスを変更しているように聞こえます。

2つ目は、デザイナーファイルがコントロールに正しい型宣言を使用していることを確認することです。それが「WebControl」またはあなたのタイプの横にある何かを言っているなら、それは問題だと私は思う。プロジェクトのプロパティでアプリケーションルートを設定することにより、このコントロールのコードがどこにあるかをVisualStudioに通知する必要がある場合があります。これが、VisualStudioが設計時に「〜」パスを解決する方法を知っている方法です。

それがうまくいかない場合は...いくつかのコードを投稿してください。

更新
OK、元のエラーが発生する理由は、コントロールがデザイナファイルで宣言されていないためです。デザイナファイルにない場合は存在しないため、「WelcomeLabel1」は「WebApplication1._Default」のメンバーではありません。これが発生する理由の1つは、コントロールを登録していないか、正しく登録されていないため、Visual Studioはそれをどう処理するかわかりません。これは、定義のないランダムな要素を宣言するようなものです。

<bp:WhatIsThis ID="someID" runat="server">

Visual Studioは、このオブジェクトが何を表しているのか見当がつかないため、ここで.designerファイルを更新しません。ここでも同じことが起こっていると思います。

更新2:プロジェクトに.csファイルを含める必要があります。この手順は、WAPではなくWebサイトを対象としているため、ウォークスルーにはおそらく含まれていません。そのため、名前空間は空です。

于 2010-03-02T20:34:55.243 に答える
0

デザイナを開くと、コントロール参照を含むdesigner.csファイルに正しく追加される場合があります。THatはおそらく欠けているものです。理由はわかりませんが、うまくいきます...

ビルドエラーまたはコンパイルエラーがありますか、それとも@Pageディレクティブがエラーを示していますか?

HTH。

于 2010-03-02T20:12:12.947 に答える