连接多个强类型 HTML 助手

Concatenate multiple strongly typed HTML Helpers

我的剃刀视图 (MVC 5) 中的代码正在使用以下模式重复,例如 FirstName、LastName、ShortName 等。我想知道是否可以封装到单个 HTML Helper,它可以接受强类型的 lambda 表达式并为我生成以下 HTML?

@Html.TextBoxFor(m => m.FirstName, new { @class = "validate" })
@Html.LabelFor(m => m.FirstName)
<span class="red-text">
    @Html.ValidationMessageFor(m => m.FirstName)
</span>

@Html.TextBoxFor(m => m.LastName, new { @class = "validate" })
@Html.LabelFor(m => m.LastName)
<span class="red-text">
    @Html.ValidationMessageFor(m => m.LastName)
</span>

@Html.TextBoxFor(m => m.ShortName, new { @class = "validate" })
@Html.LabelFor(m => m.ShortName)
<span class="red-text">
    @Html.ValidationMessageFor(m => m.ShortName)
</span>

理想情况下,我想写:

@Html.DisplayTextBox(m => m.FirstName)
@Html.DisplayTextBox(m => m.LastName)
@Html.DisplayTextBox(m => m.ShortName)

我想,这是可能实现的,但我不知道如何实现?我希望有人能帮助我或指出我可以阅读和编写代码的资源?

我不想依赖EditorTemplate,因为我想控制表单格式。

您可以创建自己的 HtmlHelper 扩展方法来生成组合输出。以下将创建 html 你的 after

using System;
using System.Linq.Expressions;
using System.Text;
using System.Web.Mvc;
using System.Web.Mvc.Html;

namespace YourAssembly.Html
{
  public static class MyHelpers
  {
    public static MvcHtmlString DisplayTextBoxFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
    {      
      MvcHtmlString label = LabelExtensions.LabelFor(helper, expression);
      MvcHtmlString textbox = InputExtensions.TextBoxFor(helper, expression, new { @class = "validate" });
      MvcHtmlString validation = ValidationExtensions.ValidationMessageFor(helper, expression);
      StringBuilder html = new StringBuilder();
      html.Append(textbox);
      html.Append(label);
      TagBuilder span = new TagBuilder("span");
      span.AddCssClass("red-text");
      span.InnerHtml = validation.ToString();
      html.Append(span.ToString());
      return MvcHtmlString.Create(html.ToString());
    }
  }
}

然后您可以通过将其添加到 web.config

使其在您的所有视图中可用
<system.web.webPages.razor>
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="System.Web.Mvc" />
      ....
      <add namespace="YourAssembly.Html" />
    </namespaces>