在自定义DisplayTemplate

时间:2016-06-06 23:39:22

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

如果您已定义自定义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则不会呈现任何内容。

1 个答案:

答案 0 :(得分:2)

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

另请注意,您没有生成表单控件,因此使用<label>元素是不合适的。

您的模板应该类似于

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

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

注意我添加了一个&#39;默认&#39;可能未应用[DisplayFormat]的属性的格式。

附注:由于属性为nullable,您还可以通过添加类似

的内容来进一步增强此功能
@if (Model == null)
{
    <div>@(ViewData.ModelMetadata.NullDisplayText ?? "Not assigned")</div>
}
else
{
    <div>@string.Format(ViewData.ModelMetadata.DisplayFormatString ?? "{0:0.00}", Model)</div>
}