web-dev-qa-db-ja.com

ASP.NETカスタムコントロール-不明なサーバータグ

リテラルコントロールを継承するカスタムコントロールを作成しました。ページでコントロールを使用しようとすると、解析エラーがスローされます。これをweb.configに追加しました

<configuration>
  <system.web>
    <pages>
      <controls>
        <add tagPrefix="one" namespace="myApplication.Controls"/>
      </controls>
    </pages>
  </system.web>
</configuration>

これを自分のページに追加しました

<%@ register namespace="myApplication.Controls" tagprefix="one" %>

どちらも問題を修正していません。プロジェクト内で正常に動作するカスタムコントロールを備えた外部アセンブリがあります。回避策として、簡単な解決策がない場合は、カスタムコントロールを外部ライブラリに移動することを検討しています。

-編集

これがページコードです。

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SignUp.ascx.cs" Inherits="myApplication.Controls.SignUp" %>
<%@ register namespace="myApplication.Controls" tagprefix="one" %>
<div class="in">
    <span>      
        <one:resourceliteral id="lblFirstname" runat="server" resourcekey="FirstName" resourceresolver="ResourceStringResolver.GetResourceString">
        </one:resourceliteral>      
        </span>
    <div>
        <pl:textbox id="txtFirstName" runat="server"></pl:textbox>
    </div>
</div>

そして、これが私の実際のコントロールのコードです

namespace myApplication.Controls
{
    public class ResourceLiteral : Literal
    {
        private ResourceManager rm;

        public delegate string dResourceResolver( string label, eLanguage language );

        public event dResourceResolver ResourceResolver;

        public string ResourceKey { get; set; }
        public object DataSource { get; set; }

        private eLanguage _Language = eLanguage.ENUS;
        public eLanguage Language
        {
            get { return _Language; }
            set { _Language = value; }
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            if (ResourceResolver != null)
                Text = ResourceResolver.Invoke( ResourceKey, _Language );
            else
            {
                if(rm != null)
                {
                    Text = rm.GetString( ResourceKey );
                }
            }
        }

        public void LoadDataSource(string resource)
        {
            rm = new ResourceManager( resource, Assembly.GetExecutingAssembly() );
        }

        public void LoadDataSource(Type resource)
        {
            rm = new ResourceManager( resource );
        }
    }
}
42
Matt

名前空間を追加するときに、アセンブリも必要であることがわかりました。アセンブリもmyApplicationの場合、web.configでこれを実行します。

<add tagPrefix="one" namespace="myApplication.Controls" Assembly="myApplication"/>

次に、クリーンアップして再構築するだけで、すべて機能するはずです。これがweb.configに追加されると、同じディレクトリ内のコントロールでこれを使用している場合を除き、ページに追加する必要はありません。Webフォームの上部にある参照が必要になります。ただし、ユーザーコントロールと同じディレクトリでカスタムサーバーコントロールを使用することはお勧めしません。

77
Jim Schubert

プロジェクトの一部であるユーザーコントロールの「不明なサーバータグ」エラーを受信して​​いました。外部アセンブリはありませんでした。 @citronasは、「これが機能しない場合、おそらくコントロールをコンパイルできない」と述べ、それが このトラブルシューティングポスト で最も可能性の高い原因としてリストされています。

私の制御コードはエラーなしでコンパイルされていましたが、無視しているという警告があることがわかりました。私の警告は、不足している別のファイルを参照していたコントロールフォルダーにあるリソースファイルに関するものでした。警告に対処すると、コントロールは正しくコンパイルされ、Registerディレクティブのみでweb.configを変更せずにコントロールを使用できました。

<%@ Register TagPrefix="myPrefix" TagName="myControl" Src="~/controls/mySourceFile.ascx" %>

<myPrefix:myControl runat="server"></myPrefix:myControl>
2
Eric Barr

私があなたを正しく理解していれば、あなたのコントロールは同じプロジェクト内にありますか?

以下を使用して、ページのマークアップにコントロールを登録してください。

<%@ Register Src="~/controls/foo.ascx" TagName="foo" TagPrefix="uc" %>

<uc:foo ID="foo1" runat="server"/>コントロールをマークアップに含めることができます。これが機能しない場合、おそらくコントロールはコンパイルできません。不要なものをコメントアウトして、もう一度試してください。

1
citronas

ASP.NET Webフォームアプリケーションを公開するときにもこの問題が発生しました。フォルダーを公開せずにサーバーのIISにコピーして貼り付ける場合でも、カスタムコントロール/ユーザーコントロールを使用するページで同様の問題が体系的に発生しました。

私はweb.configのコントロールを正しく登録し、私の開発マシンでは問題なく動作していました。登録プロセスは大丈夫だと思いました。

発行/コピーアンドペースト展開プロセスの問題を修正するには、それらを使用する各ページ(.aspx)ですべてのユーザーコントロールの名前空間とアセンブリを再登録する必要があります。

<%@ Register TagPrefix="mycompany" Namespace="MyCompany.Web.Forms.Controls" Assembly="MyCompany.Web" %>
<%@ Register TagPrefix="mycomapny" Namespace="MyCompany.Web.Forms.Controls.ValidatorComponents"  Assembly="MyCompany.Web" %>

カスタムコントロールまたはユーザーコントロールと同じ考え方であることに注意してください。この問題はVS 2012でも発生しましたが、それでも.NET 4.0です。このプロセスは、ASP.NETスキンがそのようなコントロールを参照するときにも必要です。

1