2010-01-05 32 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> 
相關問題