用于MVC HtmlHelpers的嵌套扩展方法

时间:2014-09-13 00:17:27

标签: c# asp.net-mvc html-helper

我想为我的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 个答案:

答案 0 :(得分:3)

你几乎就在那里。让我们把它分成两部分:

  1. 您需要一个静态类来容纳您的扩展方法(BootstrapHtmlHelper)。
  2. 您需要一个非静态类来容纳您的实例方法(BootStrap
  3. 所以,你只需要将第二种方法改为:

    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,因为这是您的扩展方法的名称,对吗?)