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

使用&lt;uc:foo ID="foo1" runat="server"/&gt;,您可以将控件包含到标记中。 如果这不起作用,您的控件可能无法编译。注释掉不必要的东西,然后再试一次。

【讨论】:

这不是我试图在我的页面上使用的 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 自定义控件 - 未知的服务器标记的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET用户自定义控件

如何在(asp.net)自定义服务器控件中维护状态?

如何在 ASP.NET 页面上注册自定义服务器控件

ASP.NET C# 中的自定义控件

自定义 ASP.NET 容器控件

ASP.net 自定义 GridView 控件