JQuery + Asp.Net MVC,传递浮点数

时间:2009-08-17 01:24:17

标签: c# javascript jquery asp.net-mvc

我最近和MVC合作,在尝试使用ajax向我的控制器发送请求时遇到了一个奇怪的问题。我正在使用直接来自MVC的JQuery(版本1.3.2),我正在尝试发送这样的ajax请求:

$.post("Home/OpenTrade", { price: 1.5 }, function() { }, "json");

我也尝试过parseFloat("1.5")而不是1.5 当我尝试使用

在控制器中接收此值时
[AcceptVerbs( HttpVerbs.Post)]
public void OpenTrade(float? price)

我的价格总是空的。如果我省略?控制器根本没有被调用(这并不奇怪),我尝试使用decimal以及double类型。此外,当我发送整数数据时,此函数有效(如果我发送1此控制器被调用,并且float? price已正确填充)。我错过了什么,或者它是一个错误?

广告。我可以收到价格作为字符串,然后手动解析,但我不喜欢这个解决方案,因为它不优雅,它打击使用像MVC这样的框架为我做这个的整个目的。

编辑&答:使用Joel的建议,我已经创建了一个Model Binder,我将发布,也许有人会使用它:


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
}

它可能被注册为double和double?粘合剂,双倍?如果无法解析值,它会将null传递给控制器​​。

顺便说一下。浮雕和双打的任何想法都没有开箱即用(对我而言?)?

Edit2&amp;解决方案:好的,这将是有趣的:)。它对我不起作用,因为请求的字符串发送1.5432(一个示例值),这是完全正常的,但是...... MVC试图使用我的文化设置在内部对其进行解码,格式为1 5432,因此转换无声无效 所以,要记住的事情是:如果你生活在陌生的国家,请仔细检查你的文化背景。

5 个答案:

答案 0 :(得分:5)

制作浮动模型活页夹。这可以从表单集合中提取适当的值,解析它,并将其作为参数返回

答案 1 :(得分:2)

{ price: '1,5' } 

应该没问题。

答案 2 :(得分:0)

编辑:你需要使用jQuery帖子吗?有没有什么办法可以使用内置的ajax支持来创建一个链接,那么结果是什么? e.g。

Ajax.ActionLink("Link Name", "OpenTrade", "Home",
                   new { price = 1.5f },
                   new AjaxOptions
                   {
                       OnSuccess = "success",
                       ....
                   })

指定浮点值时,通常必须使用'f'例如

对值进行后缀
float f = 1.5f;

你试过这个吗?

另一种解决方案是将您的服务方法更改为:

[AcceptVerbs( HttpVerbs.Post)]
public void OpenTrade(int dollars, int cents)

答案 3 :(得分:0)

您是否检查过服务器的JSON响应是什么?我注意到你没有用双引号封装你的价格变量,所以你对服务器的帖子将如下所示:

{'price':1.5}

我不知道这只是一个数据参数会出现问题,但我怀疑你真正希望它看起来是什么

"{'price':1.5}"

传递给ASP.Net方法的jQuery ajax方法应该有一个数据参数的字符串,否则jQuery可能会错误地序列化数据。拥有字符串意味着jQuery将单独留下您的JSON对象并将整个字符串传递给ASP.NET以便在服务器端进行解析。

答案 4 :(得分:-2)

UpdateImage(string rotationAngle)
        {
            double d;
            double.TryParse(rotationAngle, System.Globalization.NumberStyles.Number, System.Globalization.CultureInfo.InvariantCulture, out d);