@Html.DisplayNameFor() 尊重 [Display] 属性,但 @Html.DisplayFor() 忽略 [DisplayFormat] 属性

@Html.DisplayNameFor() respects [Display] attribute but @Html.DisplayFor() ignores [DisplayFormat] attribute

我有这个视图模型:

public class ConceptViewModel
{

    public int Id { get; set; }

    [Required(ErrorMessageResourceName = "Message_Required", ErrorMessageResourceType = typeof(Resources.Web.ValidationsViewModels))]
    [Display(Name = "ConceptViewModel_Name", ResourceType = typeof(Resources.Web.Contracts))]
    public string Concept { get; set; }

    [Required(ErrorMessageResourceName = "Message_Required", ErrorMessageResourceType = typeof(Resources.Web.ValidationsViewModels))]
    [Display(Name = "ConceptViewModel_TotalUnits", ResourceType = typeof(Resources.Web.Contracts))]
    [DisplayFormat(DataFormatString = "{0:###,###}")] // Ignored by @Html.DisplayFor()
    public decimal TotalUnits { get; set; }
}

该视图模型位于另一个视图模型的 collection 属性 中,而该视图模型恰好是传递给视图的视图模型:

public class ContratConceptsViewModel : BaseClass
{
    public int ContratId { get; set; }

    // This collection
    public List<ConceptViewModel> Concepts { get; set; }

    public ContratConceptsViewModel()
    {
        Concepts = new List<ConceptViewModel>();
    }
}

然后,在视图中,我有这段代码:

@model ContratConceptsViewModel

@foreach (var concept in Model.Concepts)
{
    <thead>
        <tr>
            <td> @Html.DisplayNameFor(model => concept.Concept) </td> @* Works as expected *@
            <td> @Html.DisplayNameFor(model => concept.TotalUnits) </td> @* Works as expected *@ 
        </tr>
    </thead>
    <tbody>
        <tr>
            <td> @Html.DisplayFor(model => concept.Concept) </td>
            <td> @Html.DisplayFor(model => concept.TotalUnits) </td> @* Doesn't show the correct format *@
        </tr>
    </tbody>
}

当我执行这段代码时,[Display] 属性被考虑在内,但 [DisplayFormat] 属性被完全忽略。我做错了什么?

注意:我搜索过这样的问题,尽管有很多其他标题相似的问题,但它们与这个不同。

您应该修改 DisplayForDisplayNameFor 中的表达式。 它必须是 @Html.DisplayFor(model => model.TotalUnits),而不是 @Html.DisplayFor(model => concept.TotalUnits)

更新

因为您要显示列表中的项目 @Html.DisplayFor 将无法正常工作:它应该与单一模型一起工作。我建议将每个项目的模板提取到单独的文件中(在 MVC 中称为显示模板):

您的显示模板(必须放在DisplayTemplates文件夹中):

@model ConceptViewModel
<thead>
    <tr>
        <td> @Html.DisplayNameFor(model => model.Concept) </td>
        <td> @Html.DisplayNameFor(model => model.TotalUnits) </td>
    </tr>
</thead>
<tbody>
    <tr>
        <td> @Html.DisplayFor(model => model.Concept) </td>
        <td> @Html.DisplayFor(model => model.TotalUnits) </td>
    </tr>
</tbody>

您的主页:

@model ContratConceptsViewModel

@foreach (var concept in Model.Concepts)
{
    @Html.DisplayFor(model => concept, "name of your display template, optional if you follow conventions")
}

这里是关于显示模板的link

好吧,都是我的错。我的一位同事在文件夹 Views\Shared\DisplayTemplates\Decimal.cshtml 中为 decimal 创建了一个模板。这就是 @Html.DisplayFor() 忽略该属性的原因,因为它尊重我同事创建的模板。