2010-11-08 6 views
1

Voici un morceau de classe:écriture de contrôle Fluent comme Telerik: Comprendre l'Equerres traduction

public class OneControl 
{ 
    ... 

    public OneControl Content(Action value) { 
     ContentProperty = value; 
     return this; 
    } 

    public void Render() 
    { 
     ContentProperty(); 
    } 

    ... 
} 

Puis je suis arrivé dans ma vue:

<div id="pleaseHelpMe"> 
    <% OneControlInstance.Content(() => { %> 
     Some Mixed Stuff <%= Example%> Euros 
    <% }).Render() %> 
</div> 

Je voudrais utiliser cette syntaxe dans ma bibliothèque de l'interface utilisateur, je sais comment mettre en œuvre cela, mais je ne sais pas comment cela fonctionne réellement!

Je comprends que quelque part et quelque peu un délégué est créé et fourni en tant qu'argument de la méthode Content, mais ne trouve aucune information sur ce mécanisme ou cette technique.

Pouvez-vous m'éclairer? PS: Je vais changer le titre en fonction de la réponse que je reçois.

Assumed réponse actuelle correcte:

Le compilateur traduit le code ci-dessous dans ASPX (traduction symbolique pour la compréhension):

<div id="pleaseHelpMe"> 
    <% OneControlInstance.Content(() => { 
     ViewPageInstance.Response.Write("Some Mixed Stuff "); 
     ViewPageInstance.Response.Write(Example); 
     ViewPageInstance.Response.Write(" Euros"); 
    }).Render() %> 
</div> 

Un grand merci à Hogan !!

+1

C'est un morceau de classe savoureux. – annakata

Répondre

1

() => { %> Some Mixed Stuff <%= Example%> Euros <% } est le délégué.

Dans une page .NET aspx, les éléments en dehors de %> <% (le contenu html) sont convertis en output.render(string) lorsque la page ASPX est compilée.

C'est donc le même que le code délégué:

() => 
{ 
    output.render(" Some Mixed Stuff "); 
    output.render(Example); 
    output.render(" Euros "); 
} 

commentaires précédents:

Je ne sais pas ce que vous demandez. Action value est le délégué. A partir de la documentation:

http://msdn.microsoft.com/en-us/library/018hxwa8.aspx

« encapsule une méthode qui a un seul paramètre et ne retourne pas de valeur. »

et

« Vous pouvez utiliser le délégué Action(<T>) pour passer une méthode en tant que paramètre sans déclarer explicitement un délégué personnalisé. »


Si vous voulez que votre délégué pour retourner une valeur que vous pouvez utiliser TResult Func<in T, out TResult>

1

ContentControls ont une ContentProperty field qui est essentiellement un délégué. Votre classe définit cette valeur à travers un fluent interface (essentiellement la partie return this de la méthode Content) - ce qui est juste un moyen de faciliter le développement, rien de très pertinent en soi - et ce délégué sera éventuellement exécuté par la méthode Render, qui fait partie de la durée de vie du contrôle.

Le bit que vous pourriez manquer est que vous fournissez le délégué action dans votre balisage ici:

<% OneControlInstance.Content(() => { %> 
     Some Mixed Stuff <%= Example%> Euros 
    <% }).Render() %> 

L'action est tout à l'intérieur de la méthode contenu appel, à savoir () => { stuff } que vous essayez de lire d'hôtel devrait aussi une fonction anonyme avec des arguments entre les parens et le code de fonction entre les accolades.

+0

Je comprends cela, mais qui transforme%> Html stuff <% en un délégué? Est-ce le moteur de vue? Le compilateur? – Kronos

+0

'() => {%> Certains éléments mélangés <%= Example%> Euros <%}' est le délégué. Dans une page .NET, tout ce qui est en dehors de '%><%' (le contenu html) est traduit en output.render (string) quand la page aspx est compilée. Donc, c'est le même que le code délégué: '() => {output.render (" quelques trucs mélangés "); output.render (Exemple); output.render ("Euros"); } ' – Hogan

+0

OK, je vois votre point, sympa! Cependant je pense que l'interprétation vient du moteur de vue. – Kronos

Questions connexes