连接多个强类型 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>
我的剃刀视图 (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>