46 votes

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

J'ai créé un contrôle personnalisé qui hérite du contrôle Literal. Lorsque j'essaie d'utiliser mon contrôle sur une page, une erreur d'analyse syntaxique se produit. J'ai ajouté ceci à mon web.config

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

Et j'ai ajouté ceci à ma page

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

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

--edit

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 actuel

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 votes

Nous avons besoin du code que vous écrivez qui utilise le contrôle actuel =)

0 votes

La page ascx et le code sont dans un assemblage externe ?

83voto

Jim Schubert Points 10234

Lorsque j'ajoute un espace de nom, j'ai constaté que j'avais également besoin de l'assemblage. Si votre assembly est aussi myApplication faites ça dans le web.config :

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

Ensuite, il suffit de nettoyer et de reconstruire et tout devrait fonctionner. Une fois que ceci est dans votre web.config, vous n'avez pas besoin de l'ajouter à votre page, sauf si vous l'utilisez 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 vous déconseille d'utiliser des contrôles serveur personnalisés dans le même répertoire que les contrôles utilisateur.

3 votes

C'est étrange que l'assemblage soit nécessaire, même si le contrôle est dans l'application. Merci pour votre aide.

0 votes

Once this is in your web.config, you don't need to add it to your page pour moi, c'était la cause de l'absence de fonctionnement merci.

3voto

E_B Points 96

Je recevais l'erreur "Unknown server tag" pour un contrôle utilisateur qui faisait partie de mon projet. Il n'y avait pas d'assemblage externe. @citronas a mentionné que "Si cela ne fonctionne pas, votre contrôle ne peut probablement pas compiler", et cela est également répertorié comme la cause la plus probable dans le document ce poste de dépannage .

Bien que mon code de contrôle ait été compilé sans erreur, il s'est avéré qu'il y avait des avertissements que j'ignorais. Ces 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 les avertissements corrigés, le contrôle s'est compilé correctement et j'ai pu l'utiliser avec une simple directive Register, sans modification du fichier web.config, comme ceci :

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

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

2voto

citronas Points 7354

Si je comprends bien, votre contrôle se fait au sein du même projet ?

Essayez d'enregistrer le contrôle dans le balisage de votre page avec ce qui suit :

<%@ 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é. Mettez en commentaire les éléments inutiles et réessayez.

3 votes

Ce n'est pas un contrôle web que j'essaie d'utiliser sur ma page. C'est un contrôle personnalisé qui hérite de la classe System.Web.UI.WebControls.Literal.

1voto

Mário Meyrelles Points 198

J'ai également rencontré ce problème lors de la publication de mon application ASP.NET Web Forms. Même en copiant et collant le dossier sur le serveur IIS, sans le publier, des problèmes similaires sur les pages qui utilisaient les contrôles personnalisés / contrôles utilisateur se produisaient systématiquement.

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

Pour résoudre le problème lors du processus de déploiement par publication/copie, vous devez réenregistrer tous les espaces de noms et assemblages 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 s'agit du même état d'esprit pour les contrôles personnalisés ou les contrôles utilisateur. Ce problème s'est produit même dans VS 2012 mais toujours dans .NET 4.0. Ce processus est également nécessaire lorsque votre skin ASP.NET fait référence à de tels contrôles.

0voto

Dans mon cas, l'application fonctionnait en mode local, et lors de la publication, j'ai obtenu la même erreur à partir de la balise de contrôle de l'utilisateur.

En commentant la balise de contrôle de l'utilisateur, j'ai remarqué une erreur de chemin à un autre endroit. Après avoir résolu l'autre problème et décommenté la balise de contrôle de l'utilisateur, tout a fonctionné. Il semble que l'erreur affichée ne soit pas liée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X