我正在尝试将一些常用的代码重构为帮助扩展,并且我仍然坚持语法,主要是因为我没有完全掌握泛型,lambda表达式等。
我希望能够将它放在我的视图中,并且使用我的模型的字段(例如FirstName)来生成一些使用其他Razor扩展的HTML:
@MyHelpers.BootstrapFormItem(m => m.FirstName)
目前我已经:
@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>
}
问题:
答案 0 :(得分: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());
}
}
请注意,这是一个静态类,也是一个扩展方法,第一个输入参数以'this'为前缀,这意味着它将扩展(在Intellisense中键入'。'后显示){{ 1}}。我通常会将此类放在 Utilities 文件夹中。我经常使用命名空间,并从 web.config 中引用它。
编辑回答问题:
以下是用法,它也包含在Intellisense中:
HtmlHelper<TModel>
这是输出:
@model MyClass
@Html.BootstrapFormItem(x => x.Name)