为什么可以';t我在Razor函数部分使用Html.DisplayNameFor

本文关键字:函数部 DisplayNameFor Html Razor 我在 为什么 | 更新日期: 2024-10-21 09:14:14

这是两段代码:

这是我的型号:

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的通用类型,因为它无法自动检测到它。有什么问题吗?

为什么可以';t我在Razor函数部分使用Html.DisplayNameFor

我发现了我的问题:

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)

然后一切都很好。

希望这能帮助到别人。