我正在尝试将一些常用的代码重构为帮助程序扩展,但我对语法感到困惑,很大程度上是因为我没有完全掌握泛型、lambda 表达式等。
我希望能够将其放在我的 View 中,并让它使用我的模型的字段(例如 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>
}
问题:
- 这是正确的方法吗?我希望能够将此方法与任何 View 模型字段一起使用。
- 我是否包含了正确的命名空间?这将进入 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());
}
}
请注意,这是一个静态类,也是一个扩展方法,第一个输入参数以“this”为前缀,这意味着它将扩展(在智能感知中键入“.”后显示)任何类型为 HtmlHelper<TModel>
的对象。我通常会将此类放在 Utilities 文件夹中。我也经常使用命名空间并从 web.config 中引用它。
编辑回答问题:
这是用法,Intellisense 也涵盖了它:
@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>
关于c# - 卡在 Razor 扩展上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11634117/