2014-09-13 55 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