2014-09-13 42 views
3

我想窝了一组扩展方法对我的MVC控制器我希望能够在下面的方式来调用扩展方法巢的MVC HtmlHelpers

@Html.NestedName().CustomLabelFor(m => m.Field) 

我注意到,TwitterBootstrapMVC遵循这个模式,但我已复制它不成功..有人可以告诉我如何构造我的扩展方法类的例子?

目前,我有我的顶层类,如下

public static class BootstrapHtmlHelper 
{ 
    public static BootStrap Bootstrap(this HtmlHelper html) 
    { 
     return new BootStrap(html); 
    } 
} 

在引导类我有以下方法

 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仍然是必需的,但我不确定如何将它们纳入范围?

回答

3

你快到了。让我们分成两部分:

  1. 您需要一个静态类来容纳您的扩展方法(BootstrapHtmlHelper)。
  2. 你需要一个非静态类,以容纳您的实例方法(BootStrap

所以,你只需要改变你的第二个方法:

public MvcHtmlString CustomLabelFor<TProperty>(Expression<Func<TModel, TProperty>> expression, string placeholder) 

此外,你需要修改BootStrap以存储在扩展方法中传递的模型类型参数。所以申报BootStrapBootStrap<TModel>,并在创建新的BootStrap(即new BootStrap<TModel>(html))时通过。

现在你应该可以根据您的需要来调用它:

@Html.Bootstrap().CustomLabelFor(m => m.Field) 

(你必须@Html.NestedName()但显然NestedNameBootstrap,因为那是你的扩展方法的名字吧?)

+0

是这解决了我的问题,但阻止我正确传递助手,我会更新我的问题。 – 2014-09-13 00:47:17

+0

非常感谢! – 2014-09-13 00:54:20

+0

我做了,我现在在哪里:) – 2014-09-13 01:20:21