MVC3 Decimal在编辑时截断为2位小数

时间:2011-03-25 03:38:23

标签: asp.net-mvc asp.net-mvc-3 razor

我正在使用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 = "")]

任何想法?

3 个答案:

答案 0 :(得分:32)

这就是默认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}格式。

所以你有两种可能性:

  1. 在模型中使用double代替decimal
  2. 通过创建自定义~/Views/Shared/EditorTemplates/Decimal.cshtml修改默认编辑器模板,该模板可能如下所示:

    @Html.TextBox(
        "", 
        ViewData.TemplateInfo.FormattedModelValue, 
        new { @class = "text-box single-line" }
    )
    
  3. 您可能也想修改显示模板。

答案 1 :(得分:9)

如果你不需要'EditorFor'HtmlHelper的功能,你可以简单地将它换成'TextBoxFor',它不应该截断你的十进制值......

答案 2 :(得分:6)

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; }