为什么我不能在Razor函数部分使用Html.DisplayNameFor?

时间:2016-04-19 15:41:16

标签: c# asp.net-mvc razor

这是两段代码:

这是我的模特:

public class EnrollRequest
{
    [Display(Name = "姓名")]
    public string Name { get; set; }

    [Display(Name = "性别")]
    public Gender? Gender { get; set; }

    // And other properties
}

我在此页面使用此模型:

@model EnrollRequest

这个可以通过编译:

@{ 
    System.Linq.Expressions.Expression<Func<EnrollRequest, string>> exp = item => item.Name;
    Html.DisplayNameFor(exp);
}

但是这个人不能:

@functions
{
    public MvcHtmlString DisplayData<EnrollRequest, TValue>(System.Linq.Expressions.Expression<Func<EnrollRequest, TValue>> exp)
    {
        return DisplayDataTable(Html.DisplayNameFor(exp), Html.DisplayFor(exp));
    }
}

@helper DisplayDataTable(MvcHtmlString name, MvcHtmlString data)
{
    <tr>
        <th scope="row">@name</th>
        <td>@data</td>
    </tr>
}

它在第一个Html上报告错误如下:

'HtmlHelper<EnrollRequest>' does not contain a definition for 'DisplayNameFor' and the best extension method overload 'DisplayNameExtensions.DisplayNameFor<EnrollRequest, TValue>(HtmlHelper<IEnumerable<EnrollRequest>>, Expression<Func<EnrollRequest, TValue>>)' requires a receiver of type 'HtmlHelper<IEnumerable<EnrollRequest>>'

它似乎需要一个IEnumerable作为模型但我实际上没有。但Html.DisplayNameFor的同一调用在助手中是有效的。问题是什么?

===

编辑: 我像这样调用DisplayData:

<table class="table">
    <tbody>
        @DisplayData(item => item.Name)

        @DisplayData(item => item.Gender)

        @DisplayData(item => item.School)

        @DisplayData(item => item.Grade)

        @DisplayData(item => item.Email)
    </tbody>
</table>

它要求我为DisplayData指定泛型类型,因为它无法自动检测它。有什么不对吗?

1 个答案:

答案 0 :(得分:0)

我发现了我的问题:

public MvcHtmlString DisplayData<EnrollRequest, TValue>(System.Linq.Expressions.Expression<Func<EnrollRequest, TValue>> exp)
{
    return DisplayDataTable(Html.DisplayNameFor(exp), Html.DisplayFor(exp));
}

我不小心将EnrollRequest写入了实际上并不需要的泛型类型。只需做这个修改:

public MvcHtmlString DisplayData<TValue>(System.Linq.Expressions.Expression<Func<EnrollRequest, TValue>> exp)

然后一切正常。

希望这可以帮助某人。