MVC3 十进制在编辑时被截断为 2 位小数
Posted
技术标签:
【中文标题】MVC3 十进制在编辑时被截断为 2 位小数【英文标题】:MVC3 Decimal truncated to 2 decimal places on edit 【发布时间】:2011-03-25 03:38:23 【问题描述】:我正在使用 Razor 运行 MVC3,并注意到在编辑模式下十进制值被截断为 2 位小数。我设法通过使用显示格式注释我的属性来解决它。这似乎不是一个很好的解决方案,因为我必须记住为我生成的每个新视图(或更新我的模板)执行此操作。
我检查了我们的服务返回给控制器的值,它在 1.144 处是正确的,但是当绑定到视图时,它在 TextBox 中显示为 1.14
ViewModel 属性
[Required]
[Display(Name = "Unit Price")]
public decimal UnitPrice get; set;
.cshtml代码
@Html.LabelFor(model => model.UnitPrice)
@Html.EditorFor(model => model.UnitPrice)
@Html.ValidationMessageFor(model => model.UnitPrice)
如果我用以下内容装饰该属性,那么它可以工作。
[DisplayFormat(
ApplyFormatInEditMode = true,
DataFormatString = "0:0.00###########################",
NullDisplayText = "")]
有什么想法吗?
【问题讨论】:
由于decimal
经常用在金融相关的场景中,可能MVC在这里为了自己的利益而试图变得过于聪明。
这不是 MVC 做的。您在某处有自己截断的小数模板吗?
【参考方案1】:
这就是默认的Decimal editor template is defined:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<script runat="server">
private object ModelValue
get
if (ViewData.TemplateInfo.FormattedModelValue == ViewData.ModelMetadata.Model)
return String.Format(
System.Globalization.CultureInfo.CurrentCulture,
"0:0.00", ViewData.ModelMetadata.Model
);
return ViewData.TemplateInfo.FormattedModelValue;
</script>
<%= Html.TextBox("", ModelValue, new @class = "text-box single-line" ) %>
注意0:0.00
格式。
所以你有两种可能:
-
在模型中使用
double
而不是 decimal
作为类型
通过创建一个自定义的~/Views/Shared/EditorTemplates/Decimal.cshtml
来修改默认编辑器模板,它可能看起来像这样:
@Html.TextBox(
"",
ViewData.TemplateInfo.FormattedModelValue,
new @class = "text-box single-line"
)
您可能还想修改显示模板。
【讨论】:
【参考方案2】:IMO,这篇文章有更好的选择:
html-editorfor-with-3-decimal-places
我使用此代码在我的 EditFor 中显示最多 4 个十进制数字:
[Display(Name = "Discount Percentage")]
[Range(0, 100.0)]
[DisplayFormat(DataFormatString="0:0.0000", ApplyFormatInEditMode=true)]
public Decimal? DiscountPercent get; set;
【讨论】:
这是最好的解决方案 很好,在我看来效果很好并且比创建自定义编辑器模板更好。如果您希望小数点仅显示小数点是否有小数点,请将 0 替换为 #s:[DisplayFormat(DataFormatString = "0:0.####", ApplyFormatInEditMode = true)]
【参考方案3】:
如果您不需要“EditorFor”HtmlHelper 的功能,您可以简单地将其换成“TextBoxFor”,它不应该截断您的十进制值...
【讨论】:
以上是关于MVC3 十进制在编辑时被截断为 2 位小数的主要内容,如果未能解决你的问题,请参考以下文章