Intereting Posts
Сводка методов библиотеки classов C # не отображается в intellisense Как получить задачу, использующую SynchronizationContext? И как в любом случае используется SynchronizationContext? Каковы преимущества сохранения «чистого» списка использования директив в C #? Работа с очень большими списками на x86 Отправка / отправка данных сбора данных из формы HTML / Razor в модель аргумента действия MVC Где «Разрешить этот предварительно скомпилированный сайт быть обновляемым» в Visual Studio 2010? Пожалуйста, объясните System.Linq.Enumerable.Where (предикат Func ) Международный текст iTextSharp Создает ли таймер новый stream? Является ли метод C # закрытым или виртуальным по умолчанию? Зачем нужен явный ToString () при использовании условного оператора? Управление переключателем в Windows Forms Как обновить связанные объекты в Entity Framework Проблема с базой данных MCV4 Asp.net Значение свойства изображения (C #)

Mvc UserControl с использованием HtmlHelper с HelperResult и MvcHtmlString

Я разрабатываю приложение в asp mvc, и я хочу создать несколько дружественных элементов управления для разработчиков, таких как серверные элементы управления в asp.net WebForms. В этом случае я хочу создать панель начальной загрузки с фиксированным html и отображать внутри шаблона элементов. Я делаю это так:

public static MvcHtmlString BootPanel(this IEnumerable items, Func template, string title = "") { StringBuilder sb = new StringBuilder(); sb.Append("
"); sb.Append("
"); sb.Append(title); sb.Append("
"); sb.Append("
"); var hr = new HelperResult(writer => { foreach (var item in items) { template(item).WriteTo(writer); } }); sb.Append(hr.ToHtmlString()); sb.Append("
"); sb.Append("
"); return MvcHtmlString.Create(sb.ToString()); }

Это razor Вид:

 @{ var videoGames = new[] { new VideoGame {nombre = "Shadows of mordor", precio = 66}, new VideoGame {nombre = "Spiderman", precio = 50} }; } @videoGames.BootPanel(@
@item.nombre   @item.precio
, "Titulo")

Результат визуализируется правильно с использованием classов начальной загрузки:

введите описание изображения здесь

Вопрос в том. Является ли это правильным способом реализации такого контроля?

РЕДАКТИРОВАТЬ:

Следуя вашим ответам, я обновил помощник, используя TagBuilder:

 public static MvcHtmlString BootPanel(this IEnumerable items, Func template, string title = "") { TagBuilder PanelDiv = new TagBuilder("div"); PanelDiv.AddCssClass("panel panel-info"); TagBuilder PanelHeading = new TagBuilder("div"); PanelHeading.AddCssClass("panel-heading"); PanelHeading.SetInnerText(title); TagBuilder PanelBody = new TagBuilder("div"); PanelBody.AddCssClass("panel-body"); var hr = new HelperResult(writer => { foreach (var item in items) { template(item).WriteTo(writer); } }); PanelBody.InnerHtml = hr.ToHtmlString(); PanelDiv.InnerHtml = PanelHeading.ToString() + PanelBody.ToString(); return MvcHtmlString.Create(PanelDiv.ToString()); } 

Убедитесь, что вы зацикливаете выходную строку перед возвратом, так как если кто-то пишет javascript для заголовка, то это приводит к инъекции скрипта. Помимо этого он выглядит, но вместо этого с использованием жестко закодированных тегов вы можете использовать class TagBuilder для создания своего HTML-кода. См. Этот пример .