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

68
задан M4N 11 August 2010 в 16:49
поделиться

2 ответа

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

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

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

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

<%: s %>  -- outputs "&lt;tag&gt;"
<%: hs %> -- outputs "<tag>"
27
ответ дан 24 November 2019 в 14:18
поделиться

К сожалению, 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

57
ответ дан 24 November 2019 в 14:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: