ASP.NET自定义控件 - 未知的服务器标记

时间:2010-01-05 21:14:37

标签: c# asp.net custom-controls

我已经制作了一个继承自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 );
        }
    }
}

5 个答案:

答案 0 :(得分:77)

添加命名空间时,我发现我还需要程序集。如果您的程序集也是myApplication,请在web.config中执行此操作:

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

然后,只需清理并重建,它应该全部工作。一旦这在你的web.config中,你不需要将它添加到你的页面,除非你在同一目录中的控件中使用它,那么你需要在Web表单顶部的引用。但是,我建议不要在与用户控件相同的目录中使用自定义服务器控件。

答案 1 :(得分:2)

我收到了&#34;未知的服务器代码&#34;作为项目一部分的用户控件的错误。没有外部装配。 @citronas提到&#34;如果这不起作用,你的控件可能无法编译。&#34;,这也被列为this troubleshooting post中最可能的原因。

虽然我的控制代码编译没有错误,但事实证明有警告我忽略了。我的警告是关于我的控制文件夹中引用另一个丢失文件的资源文件。一旦我解决了警告,那么控件编译正确,我能够使用只有一个Register指令的控件,而不是对web.config的修改,如下所示:

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

<myPrefix:myControl runat="server"></myPrefix:myControl>

答案 2 :(得分:1)

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

尝试使用以下内容在页面标记中注册控件:

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

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

答案 3 :(得分:1)

发布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皮肤引用此类控件时,也需要此过程。

答案 4 :(得分:0)

在我的情况下,应用程序在本地模式下运行,发布时从用户控件标签中得到了相同的错误。

在注释用户控件标签时,发现另一个地方出现路径错误。解决了另一个问题并取消了对用户控件标签的注释后,它开始起作用。似乎显示的错误与无关。