从jquery调用web api Post方法时出现问题

时间:2014-05-12 06:45:25

标签: jquery asp.net-mvc asp.net-mvc-4 asp.net-web-api

我从jquery ajax调用web api post方法。当我传递只有字符串属性的对象但在传递其所有属性(包括string,int和bool,

)时显示空值时,它运行正常

实体类

  public partial class Pract_Product
{
    public int Id { get; set; }

    public string Category { get; set; }

    public string Name { get; set; }

    public Nullable<decimal> Price { get; set; }

    public Nullable<double> Weight { get; set; }

    public Nullable<bool> isactive { get; set; }
}

JS

    var Pract_Product = new Object();
    //    Pract_Product.Id =  $('#Id').val(),
        Pract_Product.Category = $('#Category').val(),
        Pract_Product.Name = $('#Name').val(),
    //    Pract_Product.Price = $('#Price').val(),
     //   Pract_Product.Weight = $('#Weight').val(),
     //   Pract_Product.isactive = "1"

        alert('tested');
        $.ajax({
            url: 'http://localhost:4135/api/ProdService',
            type: 'POST',
            dataType: "json",
            data: Pract_Product,
            async: false,
            headers: { 'Password': pwd },
            success: function (data) {
                alert('success');
            },
            error: function (x, y, z) {
                debugger;
                alert(x + '\n' + y + '\n' + z);
            }
        });

API控制器操作

// POST api/ProdService
    public HttpResponseMessage PostPract_Product(Pract_Product product)
    {
   //-- code for inserting object
   }

在上面的示例中,我已经使用数据类型注释了属性,而不是该对象的字符串,然后此调用正常工作并为其他属性提供正确的字符串值和字符串属性。当我传递所有值时,它会给我内部服务器错误。我也尝试使用data:JSON.stringify(Pract_Product)但没有解析。请帮帮我......

2 个答案:

答案 0 :(得分:0)

尝试更改ASP.NET签名以接受对象,如下所示:

public HttpResponseMessage PostPract_Product(object model)
{
    // now convert from object to Pract_Product
    var jsonString = model.ToString();
    Pract_Product result = JsonConvert.DeserializeObject<Pract_Product>(jsonString);
    //-- code for inserting object
}

答案 1 :(得分:0)

问题在于序列化十进制变量 0小数部分 JSON

因此 1.23将被正确序列化为1.23 ,但 1.00将被序列化为1

要解决这个问题,你基本上可以做到:

- 将小数转换为固定格式:

Pract_Product.Price = $('#Price').val().toFixed(2);(其中2是小数部分的位数)。

JavaScript toFixed()

的文档

- 创建自定义模型活页夹(建议使用here):

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 {
            actualValue = Convert.ToDecimal(valueResult.AttemptedValue, 
                CultureInfo.CurrentCulture);
        }
        catch (FormatException e) {
            modelState.Errors.Add(e);
        }

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

并在Global.asax的Application_Start中注册:

protected void Application_Start() {
    ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());   
}

另外,我建议您将contentType: 'application/json; charset=utf-8'添加到您的ajax请求中。

二手文章:JSON and .NET DecimalsASP.NET MVC3 JSON decimal binding woes