如何在数值上使用注释[DataFormat(DataFormatString="")]
以及Units
值(因条目而异)以显示带有标签的值(例如{{1} }?
在ASP.NET MVC 5应用程序中,我有三个实体:"$1.00 per Pound"
,Product
和Store
(Price是桥实体)。 Price
有Product
和int 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; }
}
答案 0 :(得分:1)
具有行为的属性通常为bad design practice。虽然在大多数情况下都可以使属性显示静态格式,但正如您所发现的那样,如果您需要数据是动态的,则很难自定义。
最好的办法是制作一个包含计算和显示逻辑的ViewModel,这样它们既不属于您的模型,也不属于您的视图。