68 votes

Comment concaténer plusieurs instances de MvcHtmlString ?

J'ai quelques doutes sur la façon de concaténer les instances de MvcHtmlString à cause de cette information trouvée dans MSDN :

Classe MvcHtmlString Représente une chaîne de caractères codée en HTML qui ne doit pas être encodée à nouveau

Est-ce que je risque que les chaînes soient codées deux fois en HTML en utilisant un code comme celui-ci :

var label = Html.LabelFor(model => model.Email);
var textbox = Html.TextBoxFor(model => model.Email);
var validation = Html.ValidationMessageFor(model => model.Email);

var result = MvcHtmlString.Create(
  label.ToString() + textbox.ToString() + validation.ToString());

(note : ceci est censé aller dans une méthode d'extension de HtmlHelper pour réduire la duplication de code dans les vues).

57voto

Ryan Points 2982

Dommage que le C# ne nous permette pas de remplacer l'opérateur + ici ! Pourquoi ne pas utiliser une méthode d'extension à la place ?

public static MvcHtmlString Concat(this MvcHtmlString first, params MvcHtmlString[] strings)
{
    return MvcHtmlString.Create(first.ToString() + string.Concat(strings.Select(s => s.ToString())));
}

Cela pourrait probablement être optimisé, mais vous pouvez vous en contenter. Il devrait être assez trivial de prouver que cela ne double pas les chaînes de caractères avec un test unitaire.

Exemple d'utilisation :

label.Concat(textbox, validation)   

Et maintenant une publicité éhontée pour mon blog : Utiliser TagBuilder ou HtmlTags pour nettoyer votre HTML

27voto

marcind Points 38002

Votre code est correct.

Cet extrait de MSDN signifie qu'un moteur de visualisation d'encodage (tel que le moteur de visualisation Aspx dans .NET 4 lorsqu'il utilise la fonction <%: %> ou le moteur de vue Razor dans MVC 3) ne doit pas ré-encoder la valeur de la chaîne de l'objet.

Donc, par exemple :

string s = "<tag>";
var hs = MvcHtmlString.Create(s);

<%: s %>  -- outputs "&lt;tag&gt;"
<%: hs %> -- outputs "<tag>"

20voto

Miguel Vitorino Points 2065

J'ai opté pour cette approche :

    private static MvcHtmlString Concat(params MvcHtmlString[] items)
    {
        var sb = new StringBuilder();
        foreach (var item in items.Where(i => i != null))
            sb.Append(item.ToHtmlString());
        return MvcHtmlString.Create(sb.ToString());
    }

C'est juste une méthode utilitaire que j'utilise à l'intérieur des classes avec des méthodes d'extension pour HtmlHelper.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X