2012-07-24 92 views
2

我試圖重構一些常用代碼到一個輔助擴展,我堅持的語法,主要是因爲我沒有仿製藥的完整的抓地力,滯留lambda表達式等在剃刀擴展

我希望能夠把這個在我看來,併爲它用我的模型的字段(如名字)來產生一些HTML,使得使用其他刀片擴展:

@MyHelpers.BootstrapFormItem(m => m.FirstName) 

目前我ve得到了:

@using System.Web.Mvc; 
@using System.Web.Mvc.Html; 
@using System.Linq; 
@using System.Linq.Expressions; 

@helper BootstrapFormitem(XXXXXXXXX) 
{ 
     <div class="control-group"> 
      @Html.LabelFor(XXXXXXX) 
      <div class="controls"> 
       @Html.DisplayFor(XXXXX) 
       @Html.ValidationMessageFor(XXXX) 
      </div> 
     </div> 
} 

問題:

  1. 這是正確的做法嗎?我希望能夠在任何viewmodel字段中使用此方法。
  2. 我是否包含正確的命名空間?這將進入app_code文件夾中
  3. XXXXXX中有什麼?

回答

2

該類你需要什麼,我用這一切的時候:

using System; 
using System.Linq.Expressions; 
using System.Text; 
using System.Web.Mvc; 
using System.Web.Mvc.Html; 

public static class HtmlHelpers 
{ 
    public static MvcHtmlString BootstrapFormItem<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression) 
    { 
     StringBuilder html = new StringBuilder("<div class=\"control-group\">"); 
     html.AppendLine(helper.LabelFor(expression).ToString()); 
     html.AppendLine("<div class=\"controls\">"); 
     html.AppendLine(helper.DisplayFor(expression).ToString()); 
     html.AppendLine(helper.ValidationMessageFor(expression).ToString()); 
     html.AppendLine("</div>"); 
     html.AppendLine("</div>"); 
     return MvcHtmlString.Create(html.ToString()); 
    } 
} 

注意,這是一個靜態類,並擴展方法,第一個輸入參數的前綴是「本」這意味着它將擴展(在Intellisense中鍵入'。'後顯示)HtmlHelper<TModel>類型的任何對象。我通常會把這個課程放在Utilities文件夾中。我經常使用命名空間,並從web.config引用它。

編輯回答問題:

這裏是使用,它是通過智能感知,以及覆蓋:

@model MyClass 

@Html.BootstrapFormItem(x => x.Name) 

這是輸出:

<div class="control-group"> 
    <label for="Name">Name</label> 
    <div class="controls"> 
     naspinski 
     <span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true"/> 
    </div> 
</div> 
+0

你能解釋爲什麼你在課堂上做了這個而不是聲明性的?我選擇了這樣做,以便我可以使用智能感知和剃刀語法檢查等。 – rwalter 2012-07-24 16:33:52

+0

另外 - 你可以舉一個例子嗎?我上面指定的用法不起作用,因爲它需要2個參數。非常感謝。 – rwalter 2012-07-24 16:48:56

+0

這也將使用智能感知 - 編輯來回答問題。 – naspinski 2012-07-24 16:53:04