【问题标题】:@Html.DisplayNameFor() respects [Display] attribute but @Html.DisplayFor() ignores [DisplayFormat] attribute@Html.DisplayNameFor() 尊重 [Display] 属性,但 @Html.DisplayFor() 忽略 [DisplayFormat] 属性
【发布时间】:2020-01-16 08:06:32
【问题描述】:

我有这个视图模型:

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; }
}

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

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] 属性被完全忽略。我做错了什么?

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

【问题讨论】:

  • , 应该是组分隔符还是小数分隔符?向我们展示数据、预期格式和错误显示格式的示例

标签: asp.net asp.net-mvc asp.net-mvc-5


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您应该修改DisplayForDisplayNameFor 中的表达式。 它必须是@Html.DisplayFor(model =&gt; model.TotalUnits),而不是@Html.DisplayFor(model =&gt; 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

    【讨论】:

    • 我尝试了一个模型为ConceptViewModel的部分,但它也没有工作。我不需要整个ConceptViewModel 的显示模板,问题只是decimal 属性。即使我为整个ConceptViewModel 创建模板,当我在decimal 属性上调用DisplayFor() 时也会遇到同样的问题。由 MVC 创建的 decimal 有一个 default display template,当指定格式时,该模板会尊重它。但在我的情况下……
    • It must be @Html.DisplayFor(model =&gt; model.TotalUnits), not @Html.DisplayFor(model =&gt; concept.TotalUnits) - 没关系。即使 lambda 的右侧部分未连接到左侧部分,该属性也将被正确使用。 @Html.DisplayFor will not work properly: it's supposed to work with single model - 这正是 OP (正确)使用 model =&gt; concept.TotalUnits 的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多