Методы расширения гнезда для MVC HtmlHelpers
Я хочу вложить набор методов расширения для моих контроллеров MVC, я хочу иметь возможность вызывать по следующей схеме
@Html.NestedName().CustomLabelFor(m => m.Field)
Я заметил, что TwitterBootstrapMVC следует этому шаблону, но мне не удалось воспроизвести его. Может ли кто-нибудь показать мне пример того, как я буду структурировать свой класс метода расширения?
В настоящее время у меня есть класс высшего уровня, как показано ниже
public static class BootstrapHtmlHelper
{
public static BootStrap Bootstrap(this HtmlHelper html)
{
return new BootStrap(html);
}
}
Вложенный в класс Bootstrap у меня есть следующий метод
public static MvcHtmlString CustomLabelFor <TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression, string placeholder)
{
StringBuilder sb = new StringBuilder();
return new MvcHtmlString(sb.ToString());
}
Очевидно, что это больше не может быть статичным, но как мне заменить то, что было бы "этим", чтобы мой метод оставался функцией? Очевидно, что TModel и TProperty по-прежнему требуются, но я не уверен, как их использовать?
1 ответ
Ты почти там. Давайте разберем это на две части:
- Вам нужен статический класс для размещения вашего метода расширения (
BootstrapHtmlHelper
). - Вам нужен нестатический класс для размещения вашего метода экземпляра (
BootStrap
)
Итак, вам просто нужно изменить ваш второй метод на:
public MvcHtmlString CustomLabelFor<TProperty>(Expression<Func<TModel, TProperty>> expression, string placeholder)
Также вам нужно будет изменить BootStrap
сохранить параметр типа модели, переданный в методе расширения. Так объявляю BootStrap
как BootStrap<TModel>
и передать это при создании нового BootStrap
(т.е. new BootStrap<TModel>(html)
).
Теперь вы сможете вызывать его по своему желанию:
@Html.Bootstrap().CustomLabelFor(m => m.Field)
(Ты имел @Html.NestedName()
но очевидно NestedName
должно быть Bootstrap
, так как это имя вашего метода расширения, верно?)