【问题标题】:MVC3 Decimal truncated to 2 decimal places on editMVC3 十进制在编辑时被截断为 2 位小数
【发布时间】: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 做的。您在某处有自己截断的小数模板吗?

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


【解决方案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} 格式。

所以你有两种可能:

  1. 在模型中使用 double 而不是 decimal 作为类型
  2. 通过创建一个自定义的~/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”,它不应该截断您的十进制值...

    【讨论】:

      猜你喜欢
      • 2016-04-22
      • 2021-10-12
      • 1970-01-01
      • 2011-10-01
      • 2017-09-07
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多