DisplayFor和ValueFor的区别

9

我想知道ValueForDisplayFor之间的区别。最近我才知道ValueFor,而我一直使用DisplayFor来显示值。

我创建了一个模型,并设置了两个属性,在测试项目中进行测试:

public class TestModel
{
    [Display(Name = "Montant")]
    [DisplayFormat(DataFormatString = "{0:C2}")]
    public Decimal Amount
    {
        get;
        set;
    }

    [Display(Name = "Date d'achat")]
    [DataType(DataType.Date)]
    public DateTime Date
    {
        get;
        set;
    }
}

这是我得到的结果:
TestModel model = new TestModel
{
    Amount = 1234.333M,
    Date = DateTime.Today.AddDays(-10)
};

@Html.DisplayFor(x => x.Amout)   => "1 234,33 €"
@Html.ValueFor(x => x.Amount)    => "1234,333"

@Html.DisplayFor(x => x.Date)    => "23/03/2014"
@Html.ValueFor(x => x.Date)      => "23/03/2014 00:00:00"

我看到,使用ValueFor没有比使用@Model.PropertyName更有优势。
在寻找答案时,我偶然发现了这个问题。尽管最受欢迎的回答并没有被评为最佳答案,但它给出的结果与我的不同。
有人知道我们为什么会得到不同的结果,以及ValueFor的真正用途是什么吗?
1个回答

6

我第一次听说ValueFor,不过看了源代码后发现,ValueFor仅使用模型的元数据进行简单渲染而忽略任何关联的模板(内置或自定义)


进一步挖掘发现,实际上ValueFor的结果相当于使用当前区域设置调用String.FormatConvert.ToString,具体取决于是否提供自定义格式。

@Html.ValueFor(x => x.Amount) = Convert.ToString(x.Amount, CultureInfo.CurrentCulture)
@Html.ValueFor(x => x.Amount, "0.00") = String.Format(x.Amount, "0.00", CultureInfo.CurrentCulture)

1
当我使用ValueFor时,您如何解释元数据(DataTypeDisplayFormat)根本未被使用? - Mickaël Derriey
1
@mickaeld,尽管源代码表明它应该使用元数据,但实际上并没有。如果你跟随源路径,它会调用HtmlHelper.FormatValue,它内部调用ViewDataDictionary.FormatValueInternal,然后只是调用Convert.ToStringString.Format,具体取决于你是否提供了自定义格式参数。我已经修改了我的答案。 - James
1
@mickaeld:如果您正在构建自己的HTML助手扩展程序,那么您应该只使用ValueFor。 - Jakob Christensen
@JakobChristensen 我不确定该方法是否应该被公开为扩展方法,如果它只用于自定义HTML助手方法。看起来,它只是在显示原始值时轻松应用格式的有用工具。 - Mickaël Derriey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接