Подтвердить что ты не робот

Как объединить несколько экземпляров 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 для уменьшения дублирования кода в представлениях).

4b9b3361

Ответ 1

Правильный код.

Этот фрагмент из MSDN означает, что механизм просмотра кодировки (такой как механизм просмотра Aspx в .NET 4 при использовании <%: %> или механизм просмотра Razor в MVC 3) не должен перекодировать строковое значение объекта.

Итак, например:

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

<%: s %>  -- outputs "&lt;tag&gt;"
<%: 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.