在剃刀扩展
问题描述:
我试图重构一些常用代码到一个辅助扩展,我坚持的语法,主要是因为我没有仿制药的完整的抓地力,滞留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>
}
问题:
- 这是正确的做法吗?我希望能够在任何viewmodel字段中使用此方法。
- 我是否包含正确的命名空间?这将进入app_code文件夹中
- XXXXXX中有什么?
答
该类你需要什么,我用这一切的时候:
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>
你能解释为什么你在课堂上做了这个而不是声明性的?我选择了这样做,以便我可以使用智能感知和剃刀语法检查等。 – rwalter 2012-07-24 16:33:52
另外 - 你可以举一个例子吗?我上面指定的用法不起作用,因为它需要2个参数。非常感谢。 – rwalter 2012-07-24 16:48:56
这也将使用智能感知 - 编辑来回答问题。 – naspinski 2012-07-24 16:53:04