2009-05-06 7 views
2

Il y a eu beaucoup de discussions sur View-engines pour ASP.NET MVC et quelques critiques contre le "tag-soup" en ligne avec for- boucles et chose comme ça. L'alternative ou le complément a été d'utiliser des aides HTML, qui ne sont que des appels de méthode en ligne.ASP.NET MVC: Utilisation de LINQ to XML pour rendre (X) HTML

Lorsque je regarde dans les HTML-aiders d'ASP.NET MVC aujourd'hui, ils utilisent une classe appelée TagBuilder.

Ma proposition est de utiliser LINQ pour XML pour obtenir fortement typé et correctement formaté (X) HTML:

XDocument output = new XDocument(); 
XElement root = new XElement("div", 
    new XAttribute("class", "root_item")); 

XElement iconImage = new XElement("img", 
    new XAttribute("src", ResolveUrl("~/image.gif")), 
    new XAttribute("alt", "This is an image")); 

XElement link = new XElement("a", 
    new XAttribute("class", "link"), 
    new XAttribute("href", "http://google.com"), 
    new XText("Link to Google")); 


root.Add(link); 
root.Add(iconImage); 
output.Add(root); 

Je l'aime parce qu'il est comme le contrôle fortement typé dans WebForms, où vous pouvez nouveau -up un bouton et l'ajouter à Control-collection d'un autre contrôle.

Y a-t-il des problèmes apparents ou des limitations à cela?

+0

Personnellement, je ne suis pas fan de TagBuilder, et j'ai dans la plupart des cas eu recours à la construction de la mienne, qui n'est en fait rien de plus qu'une chaîne.Format(). J'aime votre méthodologie, mais pourquoi ne pas utiliser TagBuilder? Vous pouvez faire le même genre de chose avec TagBuilder. –

Répondre

1

Je peux penser à deux problèmes à la méthode mentionnée ci-dessus. D'abord,

XElement iconImage = new XElement("img", 
new XAttribute("src", ResolveUrl("~/image.gif")), 
new XAttribute("alt", "This is an image")); 

En se référant à ce que vous écrivez ci-dessus, nous pouvons avoir quelque chose comme:

<img src=<%=whatever%> alt=<%=whatever%> /> 

Cela pourrait être un jugement personnel ou quoi, mais je ne vote le plus tard, un plus lisible « humaine » . À droite, en utilisant LINQ 2 XML pourrait se débarrasser de l'étrange <%}%> errant dans mes pages aspx, mais en même temps, vous faites maladroits ces «bons garçons».

Deuxième pourrait venir avec un problème de performance. Je pense que l'analyse et l'exécution de XML LINQ 2 peuvent être assez lentes, bien que je n'ai aucune donnée à ce sujet. Personnellement j'expérimente toujours le framework MVC, on a l'impression de revenir à l'ancien ASP ou PHP 3.X, puisque presque toutes les parties interactives sont gérées explicitement, au lieu de la fenêtre ASP/OS orientée GUI-OOP. Cadre net. Je pense que la principale raison pour laquelle je vais utiliser MVC est qu'il peut garantir la meilleure qualité des codes HTML côté client ..

+0

D'après mon expérience, la construction Linq to XML est incroyablement rapide - ce ne sera jamais votre goulot d'étranglement. En général, la manipulation des chaînes est assez coûteuse - il est souvent plus économique de construire une arborescence xml en utilisant des objets directement que d'effectuer des manipulations de chaînes sur un arbre sérialisé (notez que des éléments avec le même nom peuvent par exemple partage la même référence de chaîne à ce nom). Bien sûr, ASP.NET compile les vues, ce qui évite l'analyse syntaxique au moment de l'exécution + la mise en forme des chaînes ... –

3

C'est une bonne idée! Le seul problème que je vois avec c'est l'utilisation de C#. ;) VB.NET a un meilleur support pour la production de XML via sa fonction littérale XML.

Le code que vous indiquez dans votre question pourrait être écrit comme ceci dans VB.NET. (Avec l'ajout du texte « Ceci est un lien » que votre exemple ne contient aucun texte dans l'élément a.)

Dim root = <div class="root_item"> 
       <img src=<%= ResolveUrl("~/image.gif") %> alt="This is an image"/> 
       <a class="link" href="http://google.com">This is a link</a> 
      </div> 

Il y a encore <%= ... %> balises, mais ils sont contrôlés pour la validité à compiler le temps. Si ce code était la valeur de retour d'une fonction renvoyant XElement, cet extrait XHTML pouvait être réutilisé ailleurs sur le site.

J'ai un projet sur CodePlex qui utilise VB.NET XML Literals en tant que moteur ASP.NET MVC View personnalisé à http://vbmvc.codeplex.com. Il est basé sur le code Dmitry Robsman, qui est Product Unit Manager pour ASP.NET chez Microsoft. Les vues sont des classes VB.NET et les pages maîtres sont des classes de base.Vous new-up Classes de vue partielles au lieu de les référencer par une chaîne de nom, donc c'est aussi une vérification de temps de compilation supplémentaire. Au lieu de la classe HtmlHelper, qui retourne des chaînes, il existe une classe XhtmlHelper qui renvoie XElement et fonctionne de manière similaire à ce que vous avez proposé.

+0

Ajout de l'exemple text-node au code. Merci pour le rappel. –