リテラルコントロールを継承するカスタムコントロールを作成しました。ページでコントロールを使用しようとすると、解析エラーがスローされます。これを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 );
}
}
}
名前空間を追加するときに、アセンブリも必要であることがわかりました。アセンブリもmyApplication
の場合、web.configでこれを実行します。
<add tagPrefix="one" namespace="myApplication.Controls" Assembly="myApplication"/>
次に、クリーンアップして再構築するだけで、すべて機能するはずです。これがweb.configに追加されると、同じディレクトリ内のコントロールでこれを使用している場合を除き、ページに追加する必要はありません。Webフォームの上部にある参照が必要になります。ただし、ユーザーコントロールと同じディレクトリでカスタムサーバーコントロールを使用することはお勧めしません。
プロジェクトの一部であるユーザーコントロールの「不明なサーバータグ」エラーを受信していました。外部アセンブリはありませんでした。 @citronasは、「これが機能しない場合、おそらくコントロールをコンパイルできない」と述べ、それが このトラブルシューティングポスト で最も可能性の高い原因としてリストされています。
私の制御コードはエラーなしでコンパイルされていましたが、無視しているという警告があることがわかりました。私の警告は、不足している別のファイルを参照していたコントロールフォルダーにあるリソースファイルに関するものでした。警告に対処すると、コントロールは正しくコンパイルされ、Registerディレクティブのみでweb.configを変更せずにコントロールを使用できました。
<%@ Register TagPrefix="myPrefix" TagName="myControl" Src="~/controls/mySourceFile.ascx" %>
<myPrefix:myControl runat="server"></myPrefix:myControl>
私があなたを正しく理解していれば、あなたのコントロールは同じプロジェクト内にありますか?
以下を使用して、ページのマークアップにコントロールを登録してください。
<%@ Register Src="~/controls/foo.ascx" TagName="foo" TagPrefix="uc" %>
<uc:foo ID="foo1" runat="server"/>
コントロールをマークアップに含めることができます。これが機能しない場合、おそらくコントロールはコンパイルできません。不要なものをコメントアウトして、もう一度試してください。
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スキンがそのようなコントロールを参照するときにも必要です。