嵌套的Html助手

时间:2014-11-20 13:01:10

标签: c# asp.net-mvc razor

我有以下简单的剃刀代码:

<div class="form-group">
    @Html.LabelFor(model => model.BusinessName, new { @class = "col-sm-3 control-label" })
      <div class="col-sm-6">
          @Html.TextBoxFor(model => model.BusinessName, new { @class = "form-control" })
          @Html.ValidationMessageFor(model => model.BusinessName)
      </div>
</div>

我希望能够将这一切包装在自定义的html助手中,但是,在阅读有关创建自己的帮助时,我不知道如何通过现有的&#39; TextBoxFor&#39;和&#39; ValidationMessageFor&#39;我将创建的自定义html帮助器构造函数的帮助器。有没有办法做到这一点,还是我会更好地查看我想要嵌套的助手的输出并在我的自定义助手中手动创建必要的标签?

1 个答案:

答案 0 :(得分:0)

您必须传入一个表达式,该表达式返回您在帮助程序中使用的模型的属性。从那里,您可以使用TagBuilder个对象构建所需的HTML。

public static class HtmlHelperExtensions
{
    public static MvcHtmlString FormGroup<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
        var labelFor = html.LabelFor(expression);
        var textBoxFor = html.TextBoxFor(expression);
        var validationMessageFor = html.ValidationMessageFor(expression);

        var innerDivWrapper = new TagBuilder("div");
        innerDivWrapper.AddCssClass("col-sm-6");
        innerDivWrapper.InnerHtml = textBoxFor.ToHtmlString() + validationMessageFor.ToHtmlString();

        var wrapperTagBuilder = new TagBuilder("div");
        wrapperTagBuilder.AddCssClass("form-group");
        wrapperTagBuilder.InnerHtml = labelFor.ToHtmlString() + innerDivWrapper;

        return new MvcHtmlString(wrapperTagBuilder.ToString());
    }
}

您的扩展方法必须使用两个类型参数:TModel以了解您的模型类型,并TValue知道表达式返回的类型。

在Razor模板中使用此方法:

@Html.FormGroup(x => x.City)

正如Venkat在他的评论中指出的那样,通过显示模板可能会更好地实现这一点,但这将按照问题中的描述完成工作。