0

MVC4,代码优先,C# 项目

当使用显式值或从表中填充货币字段时,TextBoxFor 会显示带有 2 个小数位的值。如果该字段是从另一个类中的货币字段填充的,它将显示 4 个小数位。

  public class Class1
  {
    [Column(TypeName = "money")]
    public decimal Field1 { get; set; }
  }

  public class Class2
  {
    [Column(TypeName = "money")]
    public decimal Field1 { get; set; }
  }

  public class Table1
  {
    public int Id { get; set; } public decimal Value { get; set; }
  }

场景一:

Class1.Field1 = 14.95M;

场景二:

Class2.Field1 = Table1.Value;

场景 3:

Class1.Field1 = Class2.Field1

看法

@Html.TextBoxFor(m => m.Class1.Field1, new { style = "width:70px;" })

对于场景 1 和 2,TextBoxFor 正确显示 2 个小数位,对于场景 3,它在编辑框中显示 4 个小数位。我需要使用 TextBoxFor 以便可以传递 html 属性。

Class2 的实例本身是根据 Class2 生成的表中的值预先填充的。我已经使用 SSMS 检查了所有内容 [表中的所有适用字段都是 (money, not null)] 并在调试中,找不到任何差异。

为什么 TextBoxFor 不正确地显示场景 3 的货币格式(我知道 SQL 以 4 位小数精度存储小数)?

更重要的是,如何让我的编辑框始终以 2 位小数显示货币值?

4

2 回答 2

0

您可以四舍五入到 2 位小数(原始值是 2 位小数精度,所以我不担心舍入错误)。

decimal.Round(Value, 2)

Class1.Field1 = decimal.Round(Class2.Field1,2)

然后可以通过扩展方法来实现。

public static decimal dR2(this decimal ip) { return decimal.Round(ip, 2); }

Class1.Field1 = Class2.Field1.dR2();
于 2013-07-03T01:11:41.757 回答
0

在我的 MVC 应用程序中,我希望文本框显示为$4.95. 我使用了编辑器模板。

@if(Model != null && Model.GetType() == typeof(string))
{
    @Html.TextBox(
    "",
    string.Format("{0:c}", (decimal)decimal.Parse(Model))
    )
}

@if(Model != null && Model.GetType() == typeof(decimal))
{
    @Html.TextBox(
        "",
       string.Format("{0:c}", (decimal) Model),new {@class="no-number-validation"}
         )
}

@if(Model == null)
{
    @Html.TextBox("",null,new {@class="no-number-validation"})
}

然后显然我希望能够发送回$4.95服务器并让模型绑定器仍然自动处理它。此示例也处理 % 符号。

public class DecimalModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext,
                            ModelBindingContext bindingContext)
    {
        ValueProviderResult valueResult = bindingContext.ValueProvider
            .GetValue(bindingContext.ModelName);
        ModelState modelState = new ModelState { Value = valueResult };
        object actualValue = null;
        try
        {
            if (valueResult.AttemptedValue.StartsWith("$"))
            {
                actualValue = decimal.Parse(valueResult.AttemptedValue, NumberStyles.Currency);
            }

            if (valueResult.AttemptedValue.EndsWith("%"))
            {
                actualValue = decimal.Parse(valueResult.AttemptedValue.Replace("%", "").Trim(),
                                            CultureInfo.CurrentCulture);
            }

            if (actualValue == null)
                actualValue = Convert.ToDecimal(valueResult.AttemptedValue,
                                                CultureInfo.CurrentCulture);
        }
        catch (FormatException e)
        {
            modelState.Errors.Add(e);
        }

        bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
        return actualValue;
    }
}

这很好,因为我不必使用字符串作为货币文本框的属性类型来处理 $ 符号。当对象被填充时,没有货币符号,并且该值被分配到十进制类型中。

于 2013-07-02T23:56:18.387 回答