web-dev-qa-db-fra.com

Contrôle personnalisé ASP.NET - Balise de serveur inconnue

J'ai créé un contrôle personnalisé qui hérite d'un contrôle Literal. Lorsque j'essaie d'utiliser mon contrôle sur une page, une erreur d'analyse est levée. Je l'ai ajouté à mon web.config

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

Et je l'ai ajouté à ma page

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

Aucun de ces problèmes n'a résolu le problème. J'ai un assemblage externe avec des contrôles personnalisés qui fonctionnent très bien dans mon projet. Comme solution de contournement, j'envisage de déplacer mon contrôle personnalisé dans la bibliothèque externe s'il n'y a pas de solution simple.

--Éditer

Voici le code de la page.

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

Et voici le code de mon contrôle réel

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 );
        }
    }
}
42
Matt

Lors de l'ajout d'un espace de noms, j'ai constaté que j'avais également besoin de l'assembly. Si votre assembly est également myApplication faites cela dans web.config:

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

Ensuite, nettoyez et reconstruisez et tout devrait fonctionner. Une fois que c'est dans votre web.config, vous n'avez pas besoin de l'ajouter à votre page à moins que vous ne l'utilisiez dans un contrôle dans le même répertoire, alors vous aurez besoin de la référence en haut du formulaire web. Mais, je déconseille d'utiliser des contrôles serveur personnalisés dans le même répertoire que les contrôles utilisateur.

77
Jim Schubert

Je recevais l'erreur "balise de serveur inconnue" pour un contrôle utilisateur faisant partie de mon projet. Il n'y avait pas d'Assemblée extérieure. @citronas a mentionné que "Si cela ne fonctionne pas, votre contrôle ne peut probablement pas être compilé.", et cela est également répertorié comme la cause la plus probable dans ce message de dépannage .

Bien que mon code de contrôle se compilât sans erreur, il s'est avéré qu'il y avait des avertissements que j'ignorais. Mes avertissements concernaient un fichier de ressources qui se trouvait dans mon dossier de contrôle et qui faisait référence à un autre fichier manquant. Une fois que j'ai adressé les avertissements, le contrôle a été compilé correctement et j'ai pu utiliser le contrôle avec juste une directive Register et aucune modification de web.config, comme ceci:

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

<myPrefix:myControl runat="server"></myPrefix:myControl>
2
Eric Barr

Si je vous comprends bien, votre contrôle est dans le même projet?

Essayez d'enregistrer le contrôle dans le balisage de votre page avec les éléments suivants:

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

Avec <uc:foo ID="foo1" runat="server"/> vous pouvez inclure le contrôle dans le balisage. Si cela ne fonctionne pas, votre contrôle ne peut probablement pas être compilé. Commentez les choses inutiles et réessayez.

1
citronas

J'ai également rencontré ce problème lors de la publication de mon application Web Forms ASP.NET. Même lors de la copie et du collage du dossier sur IIS du serveur, sans le publier, des problèmes similaires sur les pages utilisant les contrôles personnalisés/contrôles utilisateur se sont produits systématiquement.

J'ai enregistré correctement les contrôles sur web.config et sur ma machine de développement, les choses fonctionnaient bien. Je pensais que le processus d'inscription était correct.

Pour résoudre le problème du processus de déploiement de publication/copie et passé, vous devez réenregistrer tous les espaces de noms et assemblys des contrôles utilisateur sur chaque page (.aspx) qui les utilise:

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

Veuillez noter qu'il en va de même pour les contrôles personnalisés ou les contrôles utilisateur. Ce problème s'est produit même dans VS 2012 mais toujours .NET 4.0. Ce processus est également nécessaire lorsque votre skin ASP.NET référence de tels contrôles.

1
Mário Meyrelles