将ASP.NET MVC Razor @helper函数转换为辅助类的方法

考虑下面的ASP.NET MVC剃刀视图片断,它定义了一个帮手

@helper FieldFor<TModel>(Expression<Func<TModel, string>> expression) { <div class="form-group"> @Html.LabelFor(expression, htmlAttributes: new {@class = "control-label col-md-2"}) <div class="col-md-10"> @Html.EditorFor(expression, new { htmlAttributes = new {@class = "form-control"} }) @Html.ValidationMessageFor(expression, "", new {@class = "text-danger"}) </div> </div> } 

什么样的模式将其转换为类似于类的方法:

 public static MvcHtmlString FieldFor(this HtmlHelper helper, FieldFor<TModel>(Expression<Func<TModel, string>> expression)) { /* Method */ } 

我发现所有的例子都集中在生成不依赖其他HTML帮助器的标记上。

签名将需要

 public static MvcHtmlString FieldFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression) 

然后,您使用TagBuilder和内置的HTML帮助器方法的组合来生成HTML

 using System; using System.Linq.Expressions; using System.Text; using System.Web.Mvc; using System.Web.Mvc.Html; namespace YourAssembly.Html { public static class FieldHelper { public static MvcHtmlString FieldFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression) { MvcHtmlString label = LabelExtensions.LabelFor(helper, expression, new { @class = "control-label col-md-2" }); MvcHtmlString editor = EditorExtensions.EditorFor(helper, expression, new { htmlAttributes = new {@class = "form-control"}}) MvcHtmlString validation = ValidationExtensions.ValidationMessageFor(helper, expression, null, new { @class = "text-danger" }); StringBuilder html = new StringBuilder(); html.Append(editor); html.Append(validation); TagBuilder innerDiv = new TagBuilder("div"); innerDiv.AddCssClass("col-md-10"); innerDiv.InnerHtml = html.ToString(); html = new StringBuilder(); html.Append(label); html.Append(innerDiv.ToString()); TagBuilder outerDiv = new TagBuilder("div"); outerDiv.AddCssClass("form-group"); outerDiv.InnerHtml = html.ToString(); return MvcHtmlString.Create(outerDiv.ToString()); } } } 

然后,通过将其添加到web.config您可以在所有视图中使其可用

 <system.web.webPages.razor> <pages pageBaseType="System.Web.Mvc.WebViewPage"> <namespaces> <add namespace="System.Web.Mvc" /> .... <add namespace="YourAssembly.Html" /> </namespaces> 

这应该很容易。 你只需要把它写成HtmlHelper扩展方法,然后使用TagBuilder来构build你的html:

 namespace Sample.Extensions { using System; using System.Linq.Expressions; using System.Web.Mvc; using System.Web.Mvc.Html; public static class TestExtensions { public static MvcHtmlString FieldFor<TModel>( this HtmlHelper<TModel> helper, Expression<Func<TModel, string>> expression) { var mainDiv = new TagBuilder("div"); mainDiv.AddCssClass("form-group"); mainDiv.InnerHtml += helper.LabelFor(expression); var colDiv = new TagBuilder("div"); colDiv.AddCssClass("col-md-10"); colDiv.InnerHtml += helper.EditorFor(expression, new { htmlAttributes = new {@class = "form-control"} }) colDiv.InnerHtml += helper.ValidationMessageFor( expression, "", new {@class = "text-danger"}); mainDiv.InnerHtml += colDiv; return new MvcHtmlString(mainDiv.ToString(TagRenderMode.Normal)); } } } 

用法:

 @using Sample.Extensions @model ... ... @Html.FieldFor(m => m.MyField)