2010-01-05 33 views
38

我已经制作了一个自定义控件,它继承了文字控件。当我尝试在页面上使用我的控件时,会引发解析错误。我已经添加到了我的web.configASP.NET自定义控件 - 未知服务器标签

<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); 
     } 
    } 
} 
+0

我们需要你使用实际控制的代码=) – zincorp 2010-01-05 21:23:28

+0

ascx页面和代码在外部程序集中? – jim 2010-01-05 21:59:40

回答

70

当增加一个命名空间中的代码,我发现我还需要装配。如果您的组装也是在web.config中myApplication做到这一点:

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

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

+3

即使控件位于应用程序中,也需要组件。感谢您的帮助。 – Matt 2010-01-05 21:57:27

+3

我可以看到为什么这个答案有这么多票。 – ProfK 2011-08-22 17:58:59

1

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

尝试在你的页面有以下标记注册控件:

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

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

+3

这不是我想要在我的页面上使用的Web控件。这是一个继承自System.Web.UI.WebControls.Literal类的自定义控件。 – Matt 2010-01-05 22:35:53

0

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

1

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

虽然我的控制代码编译没有错误,但事实证明,有些警告我忽略了,我的警告是关于一个资源文件我的控制文件夹引用了另一个缺失的文件,一旦我解决了警告,然后控件编译正确,我可以使用控件只有一个Register指令,并且没有修改web.config,如下所示:

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

<myPrefix:myControl runat="server"></myPrefix:myControl> 
相关问题