Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery MVC3模型绑定原因“;从类型';System.Int32';至';十进制';故障-无类型转换器“;_Jquery_Asp.net Mvc 3 - Fatal编程技术网

Jquery MVC3模型绑定原因“;从类型';System.Int32';至';十进制';故障-无类型转换器“;

Jquery MVC3模型绑定原因“;从类型';System.Int32';至';十进制';故障-无类型转换器“;,jquery,asp.net-mvc-3,Jquery,Asp.net Mvc 3,我得到以下异常: 参数转换时出现异常{” 从类型“System.Int32”到类型 “System.Decimal”失败,因为没有 类型转换器可以在 这些类型。“}System.Exception {System.invalidoOperationException} 这是在我使用JQuery Ajax post将json发回控制器之后。 MVC3正确地将JSON绑定到模型,因为我可以看到手表中的所有数据,但是ModelState有这个错误 该视图只有一个十进制字段和一个文本框,其中包含一个数字

我得到以下异常:

参数转换时出现异常{” 从类型“System.Int32”到类型 “System.Decimal”失败,因为没有 类型转换器可以在 这些类型。“}System.Exception {System.invalidoOperationException}

这是在我使用JQuery Ajax post将json发回控制器之后。 MVC3正确地将JSON绑定到模型,因为我可以看到手表中的所有数据,但是ModelState有这个错误

该视图只有一个十进制字段和一个文本框,其中包含一个数字。 即使文本框有一个整数值,我也会遇到这个错误


关于为什么失败,有什么想法吗?

这个问题似乎源于MVC3附带的默认模型绑定器无法将整数转换为十进制。但是,如果json中的源值是字符串或十进制值,则可以进行转换

解决方案是为十进制值创建自定义模型绑定器

将此添加到global.asax.cs

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
并创建模型绑定器:

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

要稍微改进jaffa的好答案,您可能需要使用Decimal.TryParse,以便不可转换的值(如空字符串)不会引发异常,而是以一致的方式传递给基本绑定器进行处理

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

        decimal value;
        return valueProviderResult == null || !Decimal.TryParse(valueProviderResult.AttemptedValue, out value) ? base.BindModel(controllerContext, bindingContext) : value;

    }
就我所见,最初的失败是ValueProviderResult没有提供转换器,这在内部是因为TypeDescriptor没有提供合适的转换器。这时我不再看了:)

还要记住处理可为空的小数:

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

有人能解释为什么默认行为不起作用吗?我真的不明白为什么会这样。不知道,我曾想过对MVC3项目提出一个bug,但最终我没有得到机会。