我最近和MVC一起工作,在尝试使用ajax向控制器发送请求时遇到了一个奇怪的问题.我正在使用直接与MVC的
JQuery(1.3.2版),我试图发送这样的一个jax请求:
$.post("Home/OpenTrade",{ price: 1.5 },function() { },"json");
我也尝试过parseFloat(“1.5”)而不是1.5.
当我尝试在控制器中使用这个值
[AcceptVerbs( HttpVerbs.Post)] public void OpenTrade(float? price)
我的价格总是为零.如果我省略控制器根本没有被调用(这并不奇怪),我已经尝试使用十进制以及double类型.此外,当我发送整数数据(如果我发送1这个控制器被调用,并且float?价格被正确填充),这个功能工作.我错过了什么,还是一个bug?
广告.我可以收到价格作为字符串,然后手动解析,但我不喜欢这个解决方案,因为它不优雅,它打击使用框架像MVC的全部目的为我做这个.
编辑&回答:使用Joel的建议,我创建了一个模型绑定器,我会发布,也许有人会使用它:
class DoubleModelBinder : IModelBinder { #region IModelBinder Members public object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext) { string numStr = bindingContext.ValueProvider[bindingContext.ModelName].AttemptedValue; double res; if (!double.TryParse(numStr,System.Globalization.NumberStyles.Number,System.Globalization.CultureInfo.InvariantCulture,out res)) { if (bindingContext.ModelType == typeof(double?)) return null; throw new ArgumentException(); } if (bindingContext.ModelType == typeof(double?)) return new Nullable<double>(res); else return res; } #endregion }
它可能注册为双倍和双倍?粘合剂,双重?如果值无法解决,它将传递给控制器的null.
顺便说一句.为什么浮动和双打的任何想法都不能开箱即用(对我来说)
Edit2&解决方案:好的,这很有趣:)它没有为我工作,因为请求的字符串发送1.5432(一个示例值),这是完全可以,但是… MVC正在尝试使用我的文化设置内部解码,这是期望的数字是格式1,5432,所以转换失败了.
所以,要记住的是:如果你生活在陌生的国家,请仔细检查你的文化环境.
解决方法
做一个浮动模型绑定器.这可以从表单集合中提取适当的值,解析它,并将其作为参数返回