2009-12-30 3 views
3

Je cherche un lien vers des instructions ou un walkthru pour créer des contrôles personnalisés dans Asp.net 3.5.Besoin d'aide sur la création de contrôles personnalisés Asp.Net 3.5

J'ai déjà regardé ce qui suit:

http://forums.asp.net/t/1385382.aspx: Turning un contrôle utilisateur .ascx dans un asp.net contrôle personnalisé redistribuable 3,5

http://msdn.microsoft.com/en-us/library/aa479318.aspx: Turning un contrôle utilisateur .ascx dans un Transmissible contrôle personnalisé asp.net 2.0

Je pense que les deux liens ci-dessus sont pour les contrôles composites personnalisés ce qui serait bien pour le moment, car il semble qu'il est plus facile de faire un composite plutôt qu'un contrôle personnalisé complet.

Conformément aux instructions du lien ci-dessus (aa479318), j'ai créé un fichier MyControl.ascx de contrôle utilisateur et je l'ai publié, qui a été compilé dans un fichier .dll autonome appelé App_Web_MyControl.ascx.cdcab7d2.

Puis-je mettre un

<%Register Assembly="App_Web_MyControl.ascx.cdcab7d2" 
       TagPrefix="cc" namespace="TheNamespace" %> 

dans le fichier ASPX (dans une autre application) où je voulais utiliser le contrôle personnalisé, et ajouter une référence à l'ensemble .dll dans le projet.

Le nom CustomControl n'est pas reconnu quand j'essayer de créer dans le code .aspx par

<cc:MyControl ID="idname" runat="server" /> 

J'obtiens l'erreur Element « MyControl » est pas un élément connu.

Répondre

2

C'est en retard, je sais, mais ici va ..

Je me suis tourné avec succès un UserControl .ascx dans une dll redistribuable en faisant ceci:

  1. a créé un site Web ASP.NET projet appelé AscxDll
  2. développé mon UserControl dans ledit projet à cet endroit: ~/App_UserControls/RadioButtonQuestion.ascx.
  3. Publié le projet de site Web avec seulement ces paramètres cochés dans la publication Web boîte de dialogue du site:

    Utiliser le nom fixe et assemblées seule page

    Émettre des informations de débogage

  4. Ouvrez l'invite VS cmd et exécutez: aspnet_merge "C: \ PrecompiledWebOutputDir \ AscxDll" -o AssemblyName -r
  5. Copié le AssemblyName.dll fusionné à bin dossier d'un autre projet webapp/site Web qui en avait besoin.
  6. Dans le web.config de projet client, a ajouté à pages \ contrôles < ajouter tagprefix = "MyPrefix" namespace = "ASP" assemblage = "AssemblyName"/>
  7. commande Ajouté à une page Web dans le projet client : < MyPrefix: app_usercontrols_radiobuttonquestion_ascx ID = "rbq1" runat = "server" QuestionText = "Définir par source ASPX"/>

Notez comment il est inscrit à l'aide web.config namespace = « ASP », et comment la balise sur la page Web a quelques traits de soulignement dans ce < MyPrefix: app_usercontrols_radiobuttonquestion_ascx/> Cela peut être la clé à l'endroit où vous allez mal?

Cela a bien fonctionné pour moi, même s'il m'a fallu AGES pour comprendre. Il est probablement plus facile de simplement créer un contrôle serveur ou un contrôle composite, sauf si votre interface utilisateur est très complexe.

Espérons que cela aide quelqu'un.

+0

Vous pouvez automatiser ce processus à l'aide d'un projet de déploiement Web Visual Studio, qui exécute le processus 'aspnet_merge' couplé à une interface configurable pour l'assemblage et les sorties d'espaces de noms.Ma question se rapporte à ceci à http://stackoverflow.com/questions/1006086/. Projets de déploiement Web sur MSDN: http://www.microsoft.com/downloads/details.aspx?familyId=0AA30AE8-C73B-4BDD-BB1B-FE697256C459&displaylang=en – Rabid

+0

OK merci, je devrais essayer cela. Bien que je répugne à rouvrir cette boîte de vers particulièrement désordonnée! – Netricity

0

Jetez un oeil à Scott's Post on Registration car cela vous permettra d'enregistrer votre UserControl, que vous avez converti en un contrôle personnalisé dans votre web.config. Cela vous permet également de définir le nom de tag du contrôle car le nom réel de votre classe a probablement été tronqué dans la DLL App_Web_MyControl.ascx.cdcab7d2 générée.

Cela nous espérons que vous permet de faire quelque chose comme ce qui suit ...

<?xml version="1.0"?> 

<configuration> 

    <system.web> 

    <pages> 
     <controls> 
     <add tagPrefix="cc" assembly="App_Web_MyControl.ascx.cdcab7d2" tagName="MyControl"/> 
     </controls> 
    </pages> 

    </system.web> 

</configuration> 

... esquivant ainsi votre nom de classe « questions de MonContrôle ».

L'autre option consiste à utiliser le .Net Reflector pour aller à l'intérieur de votre assembly App_Web_MyControl.ascx.cdcab7d2 (ne devrait pas avoir dit dll plus tôt) et comprendre ce que "MyControl" a changé. Ceci est un peu plus laid car ce nom généré est susceptible de changer à tout moment recompiler votre App_Web_MyControl

+0

Les ressources suivantes peuvent également vous diriger dans la bonne direction ... http://stackoverflow.com/questions/935468/convert-user-controls-to-server-controls http: //www.nathanblevins. com/Articles/Compiler un Web-User-Control-dans-un-DLL-.Net-c-.aspx http://www.codeproject.com/KB/aspnet/Usercontrol_to_WebControl.aspx http: // bhaidar.net/cs/archive/2006/01/31/83.aspx –

0

Si je vous, je commencerais ici:

Créer un projet de type « contrôle ASP.Net Server. » Il devrait créer une classe qui ressemble à ceci (ma classe est appelée ServerControl):

[DefaultProperty("Text")] 
[ToolboxData("<{0}:ServerControl1 runat=server></{0}:ServerControl1>")] 
public class ServerControl1 : WebControl 
{ 
    [Bindable(true)] 
    [Category("Appearance")] 
    [DefaultValue("")] 
    [Localizable(true)] 
    public string Text 
    { 
     get 
     { 
      String s = (String)ViewState["Text"]; 
      return ((s == null) ? "[" + this.ID + "]" : s); 
     } 

     set 
     { 
      ViewState["Text"] = value; 
     } 
    } 

    protected override void RenderContents(HtmlTextWriter output) 
    { 
     output.Write(Text); 
    } 
} 

Vous pouvez alors ajouter des champs et des propriétés et méthodes (publiques, privées ou protégées). Si vous ne souhaitez pas remplacer la méthode RenderContents, vous pouvez créer un contrôle composite en redéfinissant la méthode CreateChildControls (voir this example).

Regardez dans la classe HtmlTextWriter pour plus d'informations sur ce qu'il faut faire dans la méthode RenderContents ci-dessus.

+0

C'est absolument le bon moyen de créer des contrôles serveur plutôt que de générer/réutiliser vos UserControls. Je suis sous l'hypothèse que vous deviez absolument faire la manipulation UserControl dans un but précis. Sinon, vous devriez certainement utiliser la méthodologie ci-dessus pour écrire vos contrôles serveur. –

Questions connexes