2010-01-05 7 views
38

Ich habe ein benutzerdefiniertes Steuerelement erstellt, das von einem Literal-Steuerelement erbt. Wenn ich versuche, mein Steuerelement auf einer Seite zu verwenden, wird ein Analysefehler ausgelöst. Ich habe dasBenutzerdefiniertes ASP.NET-Steuerelement - Unbekannter Server-Tag

<configuration> 
    <system.web> 
    <pages> 
     <controls> 
     <add tagPrefix="one" namespace="myApplication.Controls"/> 
     </controls> 
    </pages> 
    </system.web> 
</configuration> 

meiner web.config hinzugefügt Und ich habe diese

<%@ register namespace="myApplication.Controls" tagprefix="one" %> 

Keines dieser behoben haben, das Problem zu meiner Seite hinzugefügt. Ich habe eine externe Assembly mit einigen benutzerdefinierten Steuerelementen, die in meinem Projekt problemlos funktionieren. Als Problemumgehung möchte ich mein benutzerdefiniertes Steuerelement in die externe Bibliothek verschieben, wenn es keine einfache Lösung gibt.

--edit

Hier ist der Seitencode.

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

Und hier ist der Code für meine eigentliche Steuerung

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

Wir brauchen den Code, den Sie schreiben, der das eigentliche Steuerelement verwendet =) – zincorp

+0

die Ascx-Seite und der Code sind in einer externen Baugruppe? – jim

Antwort

70

Wenn ein Namespace hinzugefügt, habe ich festgestellt ich brauche auch die Montage. Wenn Ihre Montage ist auch myApplication tun dies in web.config:

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

Dann nur sauber und wieder aufzubauen und es sollte alles funktionieren. Sobald dies in Ihrer web.config ist, müssen Sie es nicht zu Ihrer Seite hinzufügen, es sei denn, Sie verwenden es in einem Steuerelement im selben Verzeichnis. Dann benötigen Sie den Verweis oben im Webformular. Ich empfehle jedoch, benutzerdefinierte Serversteuerelemente im selben Verzeichnis wie Benutzersteuerelemente zu verwenden.

+3

Das ist so strang e dass es die Assembly erfordert, obwohl sich die Steuerung in der App befindet. Danke für Ihre Hilfe. – Matt

+3

Ich kann sehen, warum diese Antwort so viele Stimmen hat. – ProfK

1

Wenn ich Sie richtig verstehe, ist Ihre Kontrolle innerhalb des gleichen Projekts?

Versuchen Sie, die Kontrolle im Markup Ihrer Seite mit dem folgenden registrieren:

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

Mit <uc:foo ID="foo1" runat="server"/> Sie können, umfassen die Steuerung in das Markup. Wenn dies nicht funktioniert, kann Ihr Steuerelement wahrscheinlich nicht kompilieren. Kommentiere unnötige Sachen aus und probiere es noch einmal.

+3

Es ist kein Web-Steuerelement, das ich auf meiner Seite verwenden möchte. Es ist ein benutzerdefiniertes Steuerelement, das von der System.Web.UI.WebControls.Literal-Klasse erbt. – Matt

0

Ich hatte dieses Problem auch bei der Veröffentlichung meiner ASP.NET Web Forms-Anwendung. Selbst beim Kopieren und Einfügen des Ordners auf den IIS des Servers, ohne ihn zu veröffentlichen, traten ähnliche Probleme auf Seiten auf, die die benutzerdefinierten Steuerelemente/Benutzersteuerelemente verwendeten.

Ich habe die Steuerelemente auf web.config korrekt registriert und auf meinem Rechner funktionierte alles einwandfrei. Ich dachte, der Registrierungsprozess sei in Ordnung.

das Problem zu beheben auf Publish/Kopieren und Vergangenheit Deployment-Prozess, sollten Sie alle Bedienelemente des Namespaces und Baugruppen auf jeder Seite neu registrieren (ASPX), die nutzt sie:

<%@ Register TagPrefix="mycompany" Namespace="MyCompany.Web.Forms.Controls" Assembly="MyCompany.Web" %> 
<%@ Register TagPrefix="mycomapny" Namespace="MyCompany.Web.Forms.Controls.ValidatorComponents" Assembly="MyCompany.Web" %> 

Bitte Beachten Sie, dass für benutzerdefinierte Steuerelemente oder Benutzersteuerelemente die gleiche Einstellung gilt. Dieses Problem trat sogar in VS 2012, aber immer noch .NET 4.0 auf. Dieser Prozess wird auch benötigt, wenn ASP.NET-Skin auf solche Steuerelemente verweist.

1

Ich erhielt den Fehler "Unbekanntes Server-Tag" für ein Benutzersteuerelement, das Teil meines Projekts war. Es gab keine externe Versammlung. @citronas hat das erwähnt: "Wenn das nicht funktioniert, kann deine Kontrolle wahrscheinlich nicht kompilieren.", und das wird auch als die wahrscheinlichste Ursache in this troubleshooting post aufgeführt.

Obwohl mein Steuerelementcode ohne Fehler kompiliert wurde, stellte es sich heraus, dass es Warnungen gab, die ich ignorierte. Meine Warnungen betrafen eine Ressourcendatei, die in war Mein Steuerungsordner, der auf eine andere fehlende Datei verweist Sobald ich die Warnungen adressiert habe, wurde das Steuerelement korrekt kompiliert und ich konnte das Steuerelement nur mit einer Register-Direktive und ohne Änderungen an web.config verwenden, wie folgt:

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

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

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