2009-09-02 5 views
3

Est-ce que quelqu'un a utilisé avec succès des méthodes d'extension dans des expressions de liaison de données? Dites que j'ai une méthode d'extension appelée "GetName" attachée à "MyClass".Comment utilisez-vous les méthodes d'extension dans les expressions de liaison de données de formulaire Web?

Dans le code derrière, j'ai vérifié cela fonctionne:

MyClass myObject = new MyClass(); 
MyClass.GetName(); 

Cependant, dans un formulaire Web, j'essaie ceci:

<%@ Import Namespace="My.Namespace" %> 

Puis, dans le ItemTemplate d'un répéteur:

<%# ((MyClass)Container.DataItem).GetName() %> 

Visual Studio est cool avec cela, Intellisense est d'accord avec tout, et le projet se construit. Mais quand je le lance, je reçois:

erreur de compilation
'My.Namespace.MyClass' ne contient pas de définition pour 'GetName'

Ainsi, le code-behind acceptera la méthode d'extension, mais pas le formulaire Web. Je suppose que c'est un problème d'espacement des noms, mais j'ai importé le même espace de noms aux deux endroits.

+0

Avez-vous déjà résolu cela? –

Répondre

3

La syntaxe de la liaison de données dans les fichiers aspx/ascx est notoirement délicate. Il y a une certaine quantité d'analyse qui continue, en particulier dans cette zone de liaison. Regardez cet exemple:

Cela fonctionne:

<%# String.Format("{0:C}", DataBinder.Eval("Foo")) %> 

Mais cela ne veut pas:

<%# String.Format("{0:C}", Bind("Foo")) %> 

Pourquoi? Parce que DataBinder.Eval est une méthode réelle, Bind n'est pas. Oui, vraiment, c'est juste un jeton reconnu par l'expression lieur/analyseur - ce n'est pas vraiment compilé. Je pense que DataBinder.Eval est probablement spécial pour la compatibilité avec ASP.NET 1.1/1.0.

Juste pour compléter l'exemple, la bonne façon de lier l'expression ci-dessus est d'utiliser:

<%# Bind("Foo", "{0:C}") %> 

Hope this helps,

Précision Edit: Le compilateur C# comprend des méthodes d'extension. L'analyseur d'expression asp.net ne le fait pas.

+0

Bien que cette information puisse être utile à certaines personnes, elle ne répond pas à la véritable question. Cela dit, je ne connais pas non plus la réponse. – SynBiotik

+0

@SynBiotik Je pense que le message à retenir de ma réponse est que le compilateur comprend les méthodes d'extension, mais pas l'analyseur de pages asp.net. Puisque la syntaxe est juste du sucre syntaxique pour l'analyseur, le compilateur ne le verra jamais. TL; DR: Ce n'est pas possible. – x0n

3

Si vous liez une collection et que vous souhaitez utiliser la classe fortement typée MyClass, vous pouvez exécuter l'extension dans une fonction dans codebehind.

votre répéteur peut utiliser

<%# GetObjectName((MyClass)Container.DataItem) %> 

Votre CodeBehind aura:

protected string GetObjectName(MyClass obJect) 
    { 
     return obJect.GetName(); 
    } 

Ne pas oublier d'importer l'espace de noms de votre module d'extension.

Questions connexes