Как объединить несколько экземпляров MvcHtmlString - PullRequest
68 голосов
/ 11 августа 2010

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

Ответы [ 4 ]

57 голосов
/ 12 августа 2010

Жаль, что 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

26 голосов
/ 11 августа 2010

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

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

Так например:

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

<%: s %>  -- outputs "&lt;tag&gt;"
<%: hs %> -- outputs "<tag>"
20 голосов
/ 05 декабря 2010

Я пошел за этот подход:

    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.

2 голосов
/ 06 января 2018

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

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

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

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

var result = MvcHtmlString.Create(
    string.Concat(
        label, textbox, validation
    )
);
...