2011-02-08 4 views
0

J'essaie de compiler mon propre ensemble de contrôles dans MVC3. Donc, plutôt que de créer des extensions HTML Helper pour chacun d'entre eux, j'ai pensé que je imiterais le comportement d'autres frameworks (Telerik, DevExpress). J'ai donc créé une nouvelle extension d'assistant pour offrir ma classe d'objet;Comment faire pour rendre() au lieu de ToString()

public static IFriendlyComponentFactory Factory(this HtmlHelper helper) 
     { 
      return new FriendlyComponentFactory(helper.ViewContext); 
     } 

Et puis, à partir d'ici, je vous offre mon objet pour que je puisse définir les propriétés etc.

Si je mets @ Html.Factory(). Grille() .Nom ("Test")

Ensuite, je reçois;

MyTest.Extensions.Grid 

Ce que je comprends est le comportement ToString(). Donc, je change le ToString en sortie;

new MvcHtmlString("<h3>Test</h3>").ToString() 

Ok, je reçois le code HTML, donc je vois mes balises et tout dans la page. Hmm.

Je peux voir dans la source Telerik (j'essaie de comprendre cela par moi-même) qu'ils traitent avec ToString() et semblent sortir du HTML, mais je peux voir que le travail se fait dans le rendu à la sortie à ViewContext Writer, plutôt qu'à la sortie de ToString().

Enfin, j'ai essayé;

@{ Html.Factory().Grid().Render(); } 

et moi avons écrit directement au ViewContext.Writer. Tada, j'ai la sortie HTML. Mais, je ne veux pas avoir à entourer les accolades de code autour, je voudrais comprendre comment fournir l'interface de nettoyage.

Des idées comment je peux fournir cela?

Répondre

1

Implémenter l'interface IHtmlString à vos classes. Notez cependant que l'écriture directe sur la sortie est plus rapide, gardez cela à l'esprit pour les contrôles importants.

+0

Je pense que l'écriture à la sortie est la façon dont je veux aller mais je ne vois pas très bien comment j'y parviens. Comment puis-je obtenir la capacité d'écrire en sortie mais mettre; @ Html.Factory(). Grid() dans ma vue? – Hammerstein

+0

@ s'attend à ce que la valeur soit écrite .. vous pouvez remplacer ToString (ou ToHtmlString avec IHtmlString), écrire des choses directement dans la sortie et retourner la chaîne.Empty. Cela fonctionnera, mais personnellement, je ne considère pas cela comme une solution propre. –

+0

Je ne suis pas inquiet de faire cela maintenant, je suis après la solution propre. Je suppose qu'il me manque quelque chose avec comment Telerik le gère. – Hammerstein

1

override la distribution implicite à la chaîne et de retour Render:

public static implicit operator string(MyTest.Extensions.Grid g) 
{ 
    return g.Render(); 
} 

ou remplacer le ToString():

public string ToString() 
{ 
    return g.Render(); 
} 
Questions connexes