ASP.NET 自定义控件 - 未知的服务器标记
Posted
技术标签:
【中文标题】ASP.NET 自定义控件 - 未知的服务器标记【英文标题】:ASP.NET Custom Control - Unknown server tag 【发布时间】:2011-01-01 19:43:32 【问题描述】:我制作了一个继承自 Literal 控件的自定义控件。当我尝试在页面上使用我的控件时,会引发解析错误。我已将此添加到我的 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 );
【问题讨论】:
我们需要您编写的使用实际控件的代码 =) ascx 页面和代码在外部程序集中? 【参考方案1】:添加命名空间时,我发现我还需要程序集。如果您的程序集也是myApplication
,请在 web.config 中执行此操作:
<add tagPrefix="one" namespace="myApplication.Controls" assembly="myApplication"/>
然后,只需清理并重建它就应该可以正常工作了。一旦这在您的 web.config 中,您不需要将其添加到您的页面,除非您在同一目录中的控件中使用它,然后您需要在 Web 表单顶部的引用。但是,我建议不要在与用户控件相同的目录中使用自定义服务器控件。
【讨论】:
这太奇怪了,它需要程序集,即使控件在应用程序中。感谢您的帮助。Once this is in your web.config, you don't need to add it to your page
对我来说这是它无法正常工作的原因......谢谢【参考方案2】:
我收到了属于我项目一部分的用户控件的“未知服务器标记”错误。没有外部组装。 @citronas 提到“如果这不起作用,您的控件可能无法编译。”,这也被列为 this troubleshooting post 中最可能的原因。
虽然我的控制代码编译时没有错误,但事实证明我忽略了一些警告。我的警告是关于我的控制文件夹中引用另一个丢失文件的资源文件。一旦我解决了警告,那么控件就正确编译了,我可以使用该控件,只需要一个 Register 指令,而无需修改 web.config,如下所示:
<%@ Register TagPrefix="myPrefix" TagName="myControl" Src="~/controls/mySourceFile.ascx" %>
<myPrefix:myControl runat="server"></myPrefix:myControl>
【讨论】:
【参考方案3】:如果我理解正确,您的控制权在同一个项目中?
尝试使用以下代码在页面标记中注册控件:
<%@ Register Src="~/controls/foo.ascx" TagName="foo" TagPrefix="uc" %>
使用<uc:foo ID="foo1" runat="server"/>
,您可以将控件包含到标记中。
如果这不起作用,您的控件可能无法编译。注释掉不必要的东西,然后再试一次。
【讨论】:
这不是我试图在我的页面上使用的 Web 控件。它是一个继承自 System.Web.UI.WebControls.Literal 类的自定义控件。【参考方案4】:在发布我的 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 皮肤引用此类控件时,也需要此过程。
【讨论】:
【参考方案5】:在我的情况下,应用程序在本地模式下运行,发布时从用户控制标签收到相同的错误。
在评论用户控制标签时,注意到另一个地方的路径错误。在修复其他问题并取消注释用户控制标签后,它起作用了。似乎显示的错误是不相关的。
【讨论】:
以上是关于ASP.NET 自定义控件 - 未知的服务器标记的主要内容,如果未能解决你的问题,请参考以下文章