如何在mvc 3 razor视图中将可为空的十进制格式化为货币仅用于显示目的

Bal*_*nti 2 asp.net asp.net-mvc-3 asp.net-mvc-4

我需要帮助在mvc应用程序的剃刀视图中将可以为空的十进制字段格式化为货币(带有美元符号和逗号).下面是我的模态和视图代码.

型号:

[Display(Name = "Eligible Amount")]
[RequiredIfProjectEngineerSelected("ProjectEngineerId", "", ErrorMessage = "Eligible Amount field is Required")]        
[DisplayFormat(DataFormatString = "{0:c}")]        
public decimal? EligibleAmount { get; set; }
Run Code Online (Sandbox Code Playgroud)

查看:

@{var formated = String.Format("{0:c}",  decimal)decimal.Parse(@Model.project.ProjectTotalCost.HasValue ? @Model.project.ProjectTotalCost.Value.ToString() : ""));}
@Html.TextBoxFor(model => model.project.ProjectTotalCost, new { @Value = formatted})
Run Code Online (Sandbox Code Playgroud)

它在TextBoxFor控件中显示格式化的货币值.但是我在这里遇到的问题是,当我尝试更新值时,得到验证错误,说"值不匹配格式".

Dar*_*rov 5

首先,您应该用一行代码替换您在视图中显示的2行代码:

@Html.EditorFor(x => x.EligibleAmount)
Run Code Online (Sandbox Code Playgroud)

这将考虑DisplayFormat您在模型上定义的属性,并且您无需在视图中重复此格式.您只需将ApplyFormatInEditMode属性设置为true:即可在编辑模式下启用它:

[Display(Name = "Eligible Amount")]
[RequiredIfProjectEngineerSelected("ProjectEngineerId", "", ErrorMessage = "Eligible Amount field is Required")]        
[DisplayFormat(DataFormatString = "{0:c}", ApplyFormatInEditMode = true)]        
public decimal? EligibleAmount { get; set; }
Run Code Online (Sandbox Code Playgroud)

好的,这解决了显示部分.但模型绑定部分仍然是一个问题.为此,您可以编写自定义模型绑定器,该绑定器将考虑DisplayFormat属性中定义的格式.我已经展示了一个带有DateTime的模型绑定器的示例this post.你所要做的就是适应decimal时间,这应该是一项微不足道的任务.