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 位小数的主要内容,如果未能解决你的问题,请参考以下文章

剑道网格数字截断到小数点后 2 位。如何让它尊重用户输入的内容?

使用数据注释将十进制值验证为小数点后 2 位?

如何舍入一个浮点数?

如何将十进制值显示到小数点后 2 位?

TextBoxFor中限制为2位小数

将 BigDecimal 格式化为最多 2 个十进制数字的字符串,在小数部分删除 0