如何动态声明注释[DataFormat(DataFormatString)]来表示具有单位的值?

时间:2014-11-26 05:27:35

标签: c# asp.net-mvc entity-framework-6 data-annotations

如何在数值上使用注释[DataFormat(DataFormatString="")]以及Units值(因条目而异)以显示带有标签的值(例如{{1} }?

在ASP.NET MVC 5应用程序中,我有三个实体:"$1.00 per Pound"ProductStore(Price是桥实体)。 PriceProductint Amount字段,例如存储10盎司或1加仑。在enum Units中,我试图找出如何创建格式正确的Price字段,这是一个计算字段,将产品价格除以给定单位的数量,并以正确的单位显示。一个例子是,当在视图中显示时,价格为1.00美元的10盎司汤将会显示UnitPrice

$0.10 per Ounce.中,我可以使用以下代码段正确计算值,并在视图中显示时使用尾随字符串文字Price对其进行格式化:

" per unit"

然而,当我尝试类似的东西时:

    [DisplayFormat(DataFormatString="{0:$#,##0.00' per unit'}")]
    [Display(Name = "Unit Price")]
    public decimal UnitPrice
    {
        get { return Value / Product.Amount; }
    }

代替第一个注释,Visual Studio告诉我关键字“this”不在当前上下文中。如果我删除它,那么它认为Product引用了类而不是字段。如果我将字段的名称更改为其他任何内容,它会告诉我“非静态字段,方法或属性需要对象引用。”

我对这个优雅的解决方案感到茫然。我知道我可以创建一个单独的字段来处理它,如下所示:

    [DisplayFormat(DataFormatString="{0:$#,##0.00' per " + this.Product.Amount + "'}")]

我也可以在视图中处理这个问题,但我更希望在模型代码中一起处理它,以保持最简单。是否有可能,还是有其他方法可以这样做?

我的相关代码:

// Edited to include String.Format
[Display(Name = "Unit Price")]
public String LabeledUnitPrice
{
    get { return String.Format("{0:$#,##0.00}", UnitPrice) + " per " + this.Product.Units; }
}

1 个答案:

答案 0 :(得分:1)

具有行为的属性通常为bad design practice。虽然在大多数情况下都可以使属性显示静态格式,但正如您所发现的那样,如果您需要数据是动态的,则很难自定义。

最好的办法是制作一个包含计算和显示逻辑的ViewModel,这样它们既不属于您的模型,也不属于您的视图。