2010-02-19 6 views
1

J'ai un UserControl (disons Foo.ascx) qui a une propriété publique Type avec le nom Bar. Je cherche un moyen que lorsque je déclare ce contrôle usercontrol dans la vue source de la partie de balisage pour passer un type. par exempleComment passer un Type à un UserControl

<%@ Register Src="~/Controls/Foo.ascx" TagPrefix="prfx" TagName="fooCtrl" %> 

puis l'utiliser comme

<prfx:fooCtrl ID="theId" runat="server" /> 

si par exemple je voulais passer au contrôle du type de chaîne (par exemple typeof (string)) quelque chose qui aurait cet effet

<prfx:fooCtrl ID="theId" runat="server" Bar="typeof(string)" /> 

Comment cela peut-il être fait? Avant que quelqu'un demande, la raison est que j'ai beaucoup d'autres propriétés dans ce contrôle utilisateur que je passe de cette manière et je veux éviter d'utiliser le CodeBehind juste pour passer le Type

Répondre

1

Réponse courte, vous ne pouvez pas faire cela. L'éditeur et le compilateur traitent les fichiers .ascx comme (au final) XML. Cela signifie que les propriétés de "désérialisation" peuvent être converties en divers types primitifs mais pas en types complexes tels que System.Type. Pour travailler, ce que vous voudriez faire nécessiterait, à un certain moment pendant la compilation, qu'un attribut dans un document xml ne soit pas traité comme du texte, pas converti en un type simple, mais interprété et exécuté comme du code. Sans modifier le fonctionnement de Visual Studio et du compilateur ASP.NET, cela n'arrivera pas.


Solution:

  1. Créer une propriété publique de type string dans votre UserControl
  2. passer le AssemblyQualifiedName du type que vous souhaitez passer à la UserControl via cet attribut
  3. Utilisez le GetType(string) surcharge pour obtenir une instance de ce type dans votre code.

    < prfx: fooCtrl ID = "theID" runat = "server" Bar = "System.String, mscorlib, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089" />

et, dans le code:

/* ... */ 
var barType = Type.GetType(this.Bar); 
// do whatever you want with this type 
+0

vérifiez le commentaire que j'ai fait à la réponse de Anders Fjeldstad – Jaguar

+0

@jag cela ne va pas se produire. XML est une bête différente, et c'est XML.La seule façon d'ajouter intellisense à un document xml est d'utiliser un XSD, ce qui ne fonctionnerait pas dans votre cas. Il n'y a absolument aucun moyen d'ajouter intellisense à ce choix (sans écrire une extension pour Visual Studio). – Will

+0

@jag vous ne comprenez pas la différence entre le code et le texte, et comment VS les gère. Vous ne comprenez pas non plus la différence entre les types d'éditeurs utilisés dans VS. Et je ne fais aucune erreur sur celui-ci. Merci d'avoir joué. – Will

2

Vous pouvez ajouter une propriété de type chaîne à votre contrôle utilisateur appelé par exemple TypeName:

public string TypeName { get; set; } // Validation omitted for brevity 

changer ensuite la mise en œuvre de votre propriété Bar à:

public Type Bar { get { return Type.GetType(TypeName); } } 

De cette façon, vous pouvez écrire:

<prfx:fooCtrl ID="theId" runat="server" Bar="System.String" /> 

ont tous un code qui a besoin d'utiliser le type d'appel la propriété Bar.

+0

c'est ce que je fais maintenant, je suis à la recherche d'une méthodologie de compilation sûre, en outre, je déclare que je veux éviter le code-behind – Jaguar

+0

Markup est le texte, il sera donc difficile de passer un objet complexe comme un type et l'instancie automatiquement sans toucher au code-behind. –

+0

si je mets une propriété booléenne, intellisense vérifiera "vrai" ou "faux". je cherche la même fonctionnalité mais avec des types de type. – Jaguar

Questions connexes