Как объединить несколько экземпляров 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, чтобы уменьшить дублирование кода в просмотр.)
4 ответов:
ваш код правильный.
этот фрагмент из MSDN означает, что механизм представления кодировки (например, механизм представления Aspx в .NET 4 при использовании
<%: %>или Razor view engine в 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
Я пошел на такой подход:
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 ) );
Comments