Как объединить несколько экземпляров MvcHtmlString
У меня есть некоторые сомнения относительно того, как конкатенировать экземпляры MvcHtmlString из-за этой информации, найденной в MSDN:
Класс MvcHtmlString Представляет строку, закодированную в HTML, которая не следует снова закодировать
Я могу рискнуть, что строки дважды кодируются HTML при использовании этого кода:
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());
(обратите внимание: предполагается, что он будет использовать метод расширения HtmlHelper для уменьшения дублирования кода в представлениях).
Ответы
Ответ 1
Правильный код.
Этот фрагмент из MSDN означает, что механизм просмотра кодировки (такой как механизм просмотра Aspx в .NET 4 при использовании <%: %>
или механизм просмотра Razor в MVC 3) не должен перекодировать строковое значение объекта.
Итак, например:
string s = "<tag>";
var hs = MvcHtmlString.Create(s);
<%: s %> -- outputs "<tag>"
<%: hs %> -- outputs "<tag>"
Ответ 2
Слишком плохо С# не позволит нам переопределить оператор + здесь! Как использовать вместо этого метод расширения?
public static MvcHtmlString Concat(this MvcHtmlString first, params MvcHtmlString[] strings)
{
return MvcHtmlString.Create(first.ToString() + string.Concat(strings.Select(s => s.ToString())));
}
Возможно, это будет оптимизировано, но вы можете работать с ним. Это должно быть довольно тривиально доказать, что это не удваивает кодирование строк с помощью unit test.
Пример использования:
label.Concat(textbox, validation)
И теперь бесстыдная плагин для моего блога: Используйте TagBuilder или HtmlTags для очистки вашего HTML
Ответ 3
Я пошел на этот подход:
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());
}
Это просто метод утилиты, который я использую внутри классов с методами расширения для HtmlHelper.