У меня есть некоторые сомнения относительно того, как связать экземпляры 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 для сокращения дублирования кода в представлениях).
Ваш код правильный.
Этот фрагмент из MSDN означает, что механизм представления кодирования (например, механизм представления Aspx в .NET 4 при использовании <%:%>
или механизм представления Razor в MVC 3) не должен повторно закодировать строковое значение объекта.
Так, например:
string s = "<tag>";
var hs = MvcHtmlString.Create(s);
<%: s %> -- outputs "<tag>"
<%: 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