ASP.NET自定义控件 – 未知的服务器标签

我做了一个从Literal控件inheritance的自定义控件。 当我尝试在页面上使用我的控件时,会抛出parsing错误。 我已经添加到我的web.config

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

我已经添加到我的网页

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

这些都没有解决这个问题。 我有一个自定义控件的外部程序集,在我的项目中工作得很好。 作为一种解决方法,我正在考虑如果没有简单的解决scheme,将自定义控件移动到外部库中。

– 编辑

这是页面代码。

 <%@ 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"/> 

然后,干净和重build,它应该都工作。 一旦这是在你的web.config中,你不需要把它添加到你的页面,除非你在同一个目录下的控件中使用它,那么你需要在Web窗体顶部的引用。 但是,我build议不要在用户控件的相同目录中使用自定义服务器控件。

如果我理解正确,你的控制是在同一个项目中?

尝试使用以下命令将控件注册在页面的标记中:

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

使用<uc:foo ID="foo1" runat="server"/>可以将控件包含在标记中。 如果这不起作用,你的控制可能无法编译。 评论不必要的东西,然后再试一次。

我收到了作为我的项目一部分的用户控件的“未知服务器标记”错误。 没有外部assembly。 @citronas提到“如果这不起作用,你的控制可能无法编译。”,这也被列为这个故障排除后最可能的原因。

虽然我的控制代码编译没有错误,但事实certificate,我有一些警告,我忽略了。 我的警告是关于在我的控制文件夹引用另一个缺less的文件的资源文件。 一旦我解决了警告,然后控制编译正确,我能够使用控制只有一个注册指令,没有修改web.config,如下所示:

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

发布我的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皮肤引用这样的控件时,这个过程也是需要的。