为什么razor会自动舍入到十进制类型到2位小数?

时间:2017-04-17 07:21:32

标签: c# asp.net-mvc razor decimal rounding

这是我在View模型中的字段:

public decimal MyValue { get; set; }

以下是我在视图中显示值的方法:

@Html.EditorFor(model => model.MyValue)

我从DB一直调试并关闭了所有JS。我仍然在View中获得该模型的值为12.34345,但呈现给用户的最终值为12.34。

This问题是如何解决这个问题,但为什么不清楚。

有趣的是,当我使用时:

@Html.HiddenFor(model => model.MyValue)

四舍五入没有发生。

2 个答案:

答案 0 :(得分:1)

它是EditorTemplate的默认decimal的函数。形成source code(请注意格式为"{0:0.00}"

internal static string DecimalTemplate(HtmlHelper html)
{
    if (html.ViewContext.ViewData.TemplateInfo.FormattedModelValue == html.ViewContext.ViewData.ModelMetadata.Model)
    {
        html.ViewContext.ViewData.TemplateInfo.FormattedModelValue = String.Format(CultureInfo.CurrentCulture, "{0:0.00}", html.ViewContext.ViewData.ModelMetadata.Model);
    }
    return StringTemplate(html);
}

如果您希望将小数位显示为已保存,请使用@Html.TextBoxFor(m => m.MyValue),或者您可以使用DisplayFormatAttribute应用您自己的格式,EditorFor()方法会尊重该格式,示例

[DisplayFormat(DataFormatString = "{0:0.00000}", ApplyFormatInEditMode = true)]`
public decimal MyValue { get; set; }

答案 1 :(得分:0)

请查看以下源代码 https://github.com/aspnet/Mvc/blob/6436538068d19c475d5f7c9ce3d0080d2314f69d/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Internal/DefaultEditorTemplates.cs

见下面的方法

public static IHtmlContent DecimalTemplate(IHtmlHelper htmlHelper)
{
        if (htmlHelper.ViewData.TemplateInfo.FormattedModelValue == htmlHelper.ViewData.Model)
        {
            htmlHelper.ViewData.TemplateInfo.FormattedModelValue =
                string.Format(CultureInfo.CurrentCulture, "{0:0.00}", htmlHelper.ViewData.Model);
        }

        return StringTemplate(htmlHelper);
}