在Asp.net MVC中为DisplayNameFor方法创建一个模板

时间:2017-01-05 17:14:50

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我正在为第一种类型创建一个Asp.net MVC站点。

我创建了一个详细信息页面,并使用了类似的内容:

<ul>
    <li>
        @Html.DisplayNameFor(m => m.MyProp)
        @Html.DisplayFor(m => m.MyProp)
    </li>
<ul>

我得到类似的东西:

<ul>
    <li>
        MyProp
        MyPropValue
    </li>
<ul>

我希望我的字段标题和我的字段值包含在单个Span的内部,所以我可以在全局css中格式化它,如下所示:

<ul>
    <li>
        <span class="field-label">MyProp</span>
        <span class="field-value">MyPropValue</span>
    </li>
<ul>

我想找到一种方法来做到这一点,而不必在一个范围内包围每个字段。我可以使用DisplayTemplate为DisplayFor方法解决这个问题,但我知道我需要为DisplayNameFor做这件事,每次我使用这个方法时它会自动生成span。

我考虑过为@Html.DisplayNameFor创建自己的替代方法,但是我对这个方法的签名有点困惑。

有人知道如何实现这个目标吗?

编辑:我尝试创建一个HtmlHelper扩展方法,如下面的方法:

public static IHtmlString OxDisplayNameFor<TModel, TField> (this HtmlHelper<TModel> helper, Expression<Func<TModel, TField>> expression)
{
    return new HtmlString(String.Format(
        "<span class='display-label'>{0}</span>", "XXX"));
}

唯一剩下的就是:我如何从表达式参数中获取值?

1 个答案:

答案 0 :(得分:2)

签名与Html.DisplayNameFor的签名相同:

public static MvcHtmlString DisplayWithDisplayNameFor<TModel, TValue>(
    this HtmlHelper<TModel> html,
    Expression<Func<TModel, TValue>> expression)
{
    // construct a span tag and put html.DisplayNameFor(expression) in it
    // then another span tag and put html.DisplayFor(expression) in it
    // return all that
}

将它作为@helper更方便,但你cannot have a generic helper因此无法将属性指向的lambdas传递给它,所以你能做的最接近的是:

@helper DisplayWithDisplayName(MvcHtmlString DisplayName, MvcHtmlString DisplayValue)
{
    <span class="field-label">@DisplayName</span>
    <span class="field-value">@DisplayValue</span>
}

然后您将其称为

@DisplayWithDisplayNameFor(Html.DisplayNameFor(m => m.MyProp), Html.DisplayFor(m => m.MyProp))