2012-07-24 111 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