坚持Razor扩展

时间:2012-07-24 15:23:35

标签: c# asp.net-mvc razor razor-declarative-helpers

我正在尝试将一些常用的代码重构为帮助扩展,并且我仍然坚持语法,主要是因为我没有完全掌握泛型,lambda表达式等。

我希望能够将它放在我的视图中,并且使用我的模型的字段(例如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>
}

问题:

  1. 这是正确的做法吗?我希望能够将此方法用于任何viewmodel字段。
  2. 我是否包含了正确的命名空间?这将进入app_code文件夹
  3. XXXXXX的内容是什么?

1 个答案:

答案 0 :(得分:2)

本课程可以满足您的需求,我会一直使用这些课程:

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'为前缀,这意味着它将扩展(在Intellisense中键入'。'后显示){{ 1}}。我通常会将此类放在 Utilities 文件夹中。我经常使用命名空间,并从 web.config 中引用它。

编辑回答问题:

以下是用法,它也包含在Intellisense中:

HtmlHelper<TModel>

这是输出:

@model MyClass

@Html.BootstrapFormItem(x => x.Name)