Как объединить несколько экземпляров MvcHtmlString



У меня есть некоторые сомнения о том, как объединить экземпляры MvcHtmlString из-за этой информации, найденной в MSDN:

MvcHtmlString Class представляет 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, чтобы уменьшить дублирование кода в просмотр.)

145   4  

4 ответов:

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

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

например:

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

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

жаль, что C# не позволит нам переопределить оператор + здесь! Как насчет использования метода расширения вместо этого?

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

Это, вероятно, может быть оптимизирован, но вы можете работать с ним. Должно быть довольно тривиально доказать, что это не удваивает кодирование строк с помощью модульного теста.

пример использования:

label.Concat(textbox, validation)   

а теперь бесстыдный плагин для моего блога:используйте TagBuilder или HtmlTags, чтобы очистить ваш HTML

Я пошел на такой подход:

    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.

Я знаю, что это супер старый, но еще один способ (который я считаю более элегантным) - использовать перегрузку строкового метода Concat, определение метаданных которого

public static String Concat(params object[] args);

что в основном связывает каждый из переданных объектов, а затем объединяет результаты и возвращает объединенную строку.

таким образом, окончательный результат будет:

var result = MvcHtmlString.Create(
    string.Concat(
        label, textbox, validation
    )
);
    Ничего не найдено.

Добавить ответ:
Отменить.