【问题标题】:ASP .NET MVC 5 - decimals always zero in controllerASP .NET MVC 5 - 控制器中的小数始终为零
【发布时间】:2015-11-14 16:33:06
【问题描述】:

我正在 Visual Studio 2015 中开发一个 ASP .NET MVC 5 应用程序。 我创建了一个简单的模型:

public class Article
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string Code { get; set; }

    public string Description { get; set; }

    public decimal Price { get; set; }

}

标准的、Visual Studio 添加的控制器和视图。当然,我对价格小数字段有疑问。在尝试添加/编辑现有文章时,当我输入小数(例如 5,45)时,我收到验证错误 The field Price must be a number.。如果我将其键入为5.45,则不会出现此错误,但是在我的控制器中提交表单后,文章的Price 属性始终设置为0。 我浏览了网络和论坛,并根据this post's answer 为小数创建了模型活页夹:

public class DecimalModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        return valueProviderResult == null ? base.BindModel(controllerContext, bindingContext) : Convert.ToDecimal(valueProviderResult.AttemptedValue);

    }
}

然后在我的Global.asax.cs 文件中,我放了两行来为decimals 添加这个活页夹:

protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        FluentValidationModelValidatorProvider.Configure();

        ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
        ModelBinders.Binders.Add(typeof(decimal?), new DecimalModelBinder());
    }

但是,我仍然有同样的问题,没有任何改变。

我还尝试通过将以下 sn-p 放入我的 Web.config 文件(如 this tutorial 中的建议)来强化我的 PC 文化:

<system.web>
<globalization culture ="en-US" />
<!--elements removed for clarity-->

但始终是同一个问题:(。 你能帮我吗?我想我遗漏了一些东西,但我已经遵循了所有可能的解决方案 10 次,但它仍然是一样的......

提前谢谢你!

【问题讨论】:

  • 确保bindingContext.ValueProvider.GetValue它返回十进制而不是整数。
  • 奇怪的是,如果我在 DecimalModelBinder 的 BindModel 方法中放置一个断点并转到网页尝试编辑或添加填充了 Price 属性的新文章,则此代码永远不会执行。 ..所以我想将这个活页夹添加到默认活页夹有问题......但我不知道这可能是什么。
  • 我认为您还没有阅读他们的答案(来自您的共享链接)。 “您的值是 3,0,它不是有效的十进制类型值。它应该是 3.0,用点(.)替换“逗号(,)。”
  • 我写的是Price我放了“5.45”,所以格式没问题,它使用点,而不是逗号,但是Price的值一直是0。
  • 然后分享您的代码,您可以通过该代码将数据从视图发布到控制器或控制器以查看。

标签: c# .net asp.net-mvc asp.net-mvc-5 visual-studio-2015


【解决方案1】:

你应该实现IModelBinder:

public class DecimalModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var valueResult = bindingContext.ValueProvider
        .GetValue(bindingContext.ModelName);
        var modelState = new ModelState { Value = valueResult };
        object actualValue = null;
        try {
            actualValue = Convert.ToDecimal(valueResult.AttemptedValue, CultureInfo.CurrentCulture);
        }
        catch (FormatException e) {
            modelState.Errors.Add(e);
        }

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

然后在你的Global.asax.cs:

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());

【讨论】:

  • 感谢您的回答。然而问题是一样的——我只是有错误的 BindModel 方法,它返回 int 而不是十进制。但是您的解决方案也有效;)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 2013-01-18
相关资源
最近更新 更多