web-dev-qa-db-ja.com

ASP.NETページでカスタムサーバーコントロールを登録する方法

プロジェクトがあり、ページにカスタムサーバーコントロール(.ascxファイルがない)を登録しようとしています。私は現在使用しています

クラス宣言

namespace MyApp.Controls{
    public class CustomControl: WebControl{
        public string Text
        {
            get
            {
                String s = (String)ViewState["Text"];
                return ((s == null) ? String.Empty : s);
            }
            set
            {
                ViewState["Text"] = value;
            }
        }        
        protected override void RenderContents(HtmlTextWriter output)
        {
            output.Write(Text);
        }
    }
}

私のページでは、

<%@ Register TagPrefix="myControls" Namespace="MyApp.Controls" %>
<myControls:CustomControl runat="server" Text="What up!" />

"Unknown server tag 'myControls:CustomControl'。"というメッセージとともにパーサーエラーを受け取ります

何が悪いのですか?

24
smartcaveman

このコントロールが別のクラスライブラリにある場合、または同じコントロールにある場合でも、@ Registerでコントロールのアセンブリを指定しても問題ありません。

<%@ Register TagPrefix="myControls" Namespace="MyApp.Controls" Assembly="MyApp" %>
   <myControls:CustomControl runat="server" Text="What's up!" />

すべてが正しくコンパイルされていることを確認するために、ソリューションもクリーンアップして再構築してください!

44

コントロールが複数のページで再利用される場合、影響を受けるすべてのページに同じ<@Registerタグをコピーして貼り付けるのではなく、system.web/pages/controlsサブ要素の1つとしてweb.configに登録することをお勧めします。

web.config:

<system.web>
  <pages ...>
    <controls>
      ...
      <add tagPrefix="myCompany" namespace="MyCompany.Whatever.Controls" Assembly="Whatever"/>
    </controls>

thepage.aspx:

<myCompany:ControlClassName ID="TheStuff" runat="server" ... />
7
demp

コントロールをApp_Codeフォルダーの下に配置するか(コントロールがアセンブリにない場合)、このコントロールがあるアセンブリへの参照を追加する必要があります。

<%@ Register TagPrefix="myControls" Namespace="MyApp.Controls"
      Assembly="SomeAssembly" %>

しかし、推測では、コントロールはApp_Codeフォルダの下にありません。

5
Alex

Register属性にAssembly属性を追加する

4
Paul McCowat