【问题标题】:Use DisplayFormat within a custom DisplayTemplate在自定义 DisplayTemplate 中使用 DisplayFormat
【发布时间】:2016-06-06 23:39:22
【问题描述】:

如果您定义了自定义 DisplayTemplate,有没有办法使用为该对象定义的 DisplayFormat.DataFormatString

例如,我为 Double 定义了一个 DisplayTemplate:

<div class="form-group">
    @Html.Label("", ViewData["label"] as string, new { @class = "col-sm-6" })
    <p class="col-sm-6">
        @Html.DisplayTextFor(m => m)
    </p>
</div>

然后我的模型定义了一个DisplayFormat:

[Display(Name = "In Weight")]
[DisplayFormat(DataFormatString = "{0} lb")]
public double? InWeight{ get; set; }

在上面的示例中,DisplayTextFor 只提供了一个简单的 ToString(),而将其替换为 DisplayFor 不会呈现任何内容。

【问题讨论】:

  • 当您没有关联的表单控件时,为什么要使用@Html.Label()DisplayFor() 不起作用的原因是它会继续调用自己。您可以访问属性ModelMetadata 以生成格式化值
  • @StephenMuecke 你是对的,在这种情况下使用dl 描述列表可能更合适,但是对于格式化值的问题是相同的。

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


【解决方案1】:

@Html.DisplayTextFor(m =&gt; m) 方法没有考虑到DisplayFormatAttribute@Html.DisplayFor(m =&gt; m) 不起作用,因为它会递归调用自身创建一个无限循环。您需要访问属性ModelMetadata

还请注意,您没有生成表单控件,因此不适合使用 &lt;label&gt; 元素。

您的模板应该类似于

@model System.Double
<div>
    <div>@ViewData.ModelMetadata.GetDisplayName()</div>
    <div>@string.Format(ViewData.ModelMetadata.DisplayFormatString ?? "{0:0.00}", Model)</div>
</div>

并将类名添加到封闭元素以对其进行样式化

请注意,我为可能无法应用 [DisplayFormat] 的属性添加了“默认”格式。

旁注:由于属性是nullable,您还可以通过包含类似的内容来进一步增强它

@if (Model == null)
{
    <div>@(ViewData.ModelMetadata.NullDisplayText ?? "Not assigned")</div>
}
else
{
    <div>@string.Format(ViewData.ModelMetadata.DisplayFormatString ?? "{0:0.00}", Model)</div>
}

【讨论】:

  • 我永远无法让 string.format 在这里为我工作,最终不得不使用 DateValue.ToString(ViewData.ModelMetadata.DisplayFormatString);虽然获得批准,但我正在处理个人财产。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多