asp.net-mvc-2 - net - html dropdownlistfor mvc 5 example
Cómo concatenar varias instancias de MvcHtmlString (4)
¡Qué mal que C # no nos permita anular el operador + aquí! ¿Qué hay de usar un método de extensión en su lugar?
public static MvcHtmlString Concat(this MvcHtmlString first, params MvcHtmlString[] strings)
{
return MvcHtmlString.Create(first.ToString() + string.Concat(strings.Select(s => s.ToString())));
}
Esto probablemente podría optimizarse, pero puede ejecutarlo. Sería bastante trivial probar que esto no codifica doblemente cadenas con una prueba unitaria.
Muestra de uso:
label.Concat(textbox, validation)
Y ahora un enchufe desvergonzado para mi blog: use TagBuilder o HtmlTags para limpiar su HTML
Tengo algunas dudas sobre cómo concatenar instancias de MvcHtmlString debido a esta información que se encuentra en MSDN :
Clase MvcHtmlString Representa una cadena codificada en HTML que no se debe codificar de nuevo
¿Me arriesgo a que las cadenas estén codificadas en HTML dos veces cuando se usa un código como este?
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());
(nota: se supone que esto debe ir a un método de extensión HtmlHelper para reducir la duplicación de código en las vistas).
Fui por este enfoque:
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());
}
Es solo un método de utilidad que uso dentro de las clases con métodos de extensión para HtmlHelper.
Sé que esto es muy viejo, pero otra forma (que me parece más elegante) es usar una sobrecarga del método de cadenas Concat, cuya definición de metadatos es
public static String Concat(params object[] args);
que básicamente ToStrings pasa cada uno de los objetos y luego concatena los resultados y devuelve la cadena concatenada.
Entonces el resultado final sería:
var result = MvcHtmlString.Create(
string.Concat(
label, textbox, validation
)
);
Tu código es correcto
Ese fragmento de MSDN significa que un motor de visualización de codificación (como el motor de vista Aspx en .NET 4 cuando se utiliza <%: %>
o el motor de vista Razor en MVC 3) no debe volver a codificar el valor de cadena del objeto.
Así por ejemplo:
string s = "<tag>";
var hs = MvcHtmlString.Create(s);
<%: s %> -- outputs "<tag>"
<%: hs %> -- outputs "<tag>"