Я написал несколько помощников HTML, которые охватывают практически все элементы HTML и некоторые структуры HTML, такие как вкладки, пейджеры, деревья и т. Д. Теперь я хотел бы преобразовать их в TagHelpers. Но я не мог найти способ сделать одну важную вещь.
Чтобы сгенерировать таблицу с помощью моего помощника HTML, вам нужно написать что-то вроде этого:
@(Html.Table(Model.Items).Columns(columns =>
{
columns.BoundColumn(m => m.Id).Class("id");
columns.TemplateColumn().Class("switch")
.Pattern((model, pattern) => pattern.Html(@<span>@(model.Title)</span>));
columns.BoolColumn(m => m.Default);
})
Он принимает коллекцию в качестве параметра конструктора и делает тип элементов доступным для свойства Columns, чтобы можно было привязать свойства элемента к определенным столбцам с помощью лямбда / анонимных функций. У меня есть несколько столбцов, которые отображают текст / html в зависимости от его типа - BoundColumn отображает текст, BoolColumn принимает bool в качестве значения и отображает Да / Нет, LinkColumn отображает ссылку. И есть также TemplateColumn, который принимает IHtmlString, и таким образом вы можете передать любую структуру html, которую хотите отобразить для определенного столбца.
Я надеялся, что TagHelper будет выглядеть примерно так:
<tee-table data-source="Model.Items">
<columns>
<bound value="Id" />
<bool value="Default" />
<template value="SomeComplexType">
<span>@value.Title</span>
</template>
</columns>
</tee-table>
Но похоже, что TagHelpers совсем не поддерживает это. Я нашел эту статью: http://www.dotnet-programming.com/post/2015/10/31/Building-Complex-Controls-with-AspNet-MVC-6-TagHelpers.aspx, который как-то близко к тому, что я хотел бы сделать, но недостаточно близко. Он по-прежнему требует итерации в представлении, чего я хочу избежать. В основном потому, что вспомогательные функции тегов должны поддерживать «ощущение HTML» в представлениях MVC.
Итак, есть ли способ создать TagHelper, который будет работать как шаблон для элементов коллекции?