MVC4 - 使用Ajax将复杂模型传递给Controller时

时间:2014-03-08 19:17:01

标签: jquery ajax asp.net-mvc asp.net-mvc-4

这是一个Java脚本函数,当用户点击添加到购物篮时调用,我正在测试我的Ajax调用,然后我输入所有逻辑来构建我的表单中的正确值(现在硬编码)。 )

    function AddItem() {

    var myproduct = { Id: 1, Price: 17, ProductName:"product name" }

    var cartItem = { Quantity: 1, Product: myproduct };


    $.ajax({
        url: "/Cart/AddItem",
        type: 'post',
        data: cartItem,
        success: function (data) {
            if (data.IsSuccess) {
                alert("test Hello Success");
            }

            alert("test HELLO Fail");
        },
        error: function (jqXHR, textStatus, errorThrown) {
            alert(errorThrown + "- Error");
        }
    });
}

问题是在测试这个Java脚本时,我的控制器操作中的强类型参数只设置了一些值, 我的控制器操作如下所示:

[HttpPost]
    public JsonResult AddItem(CartItem cartItem)
    {  
        cartItem.Cart = cartService.GetCartCurrent(this);
        cartService.SaveCartItem(cartItem);

       //bla bla bla

     }

购物车项目定义如下:

[Serializable]
public class CartItem
{
    [Key]
    public int Id { get; set; }
    public virtual Product Product { get; set; }
    public virtual List<SelectedProductOption> SelectedProductOptions { get; set; }
    public virtual Cart Cart { get; set; }
    public int Quantity { get; set; }

}

所以当我设置一个断点时CartItem.Quaintity = 1但是CartItem.Product是非NULL但是Product.Id = 0和Product.Price的值是0。

为什么?

如何设置复杂模型的内部对象。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

问题似乎是您的数据未正确反序列化。您可以使用JavaScriptSerializer来解决此问题。

下面

  var myproduct = { Id: 1, Price: 17, ProductName: "product name" };

            var cartItem = { Quantity: 1, Product: myproduct };


            $.ajax({
                url: "/Home/Index",
                type: 'post',
                data: "formData=" + JSON.stringify(cartItem),
                success: function (data) {
                    if (data.IsSuccess) {
                        alert("test Hello Success");
                    }

                    alert("test HELLO Fail");
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    alert(errorThrown + "- Error");
                }
            });

[HttpPost]
    public JsonResult AddItem(string formData)
    {  
        var js = new JavaScriptSerializer();
        CartItem cartItem = js.Deserialize<CartItem>(formData);

        cartItem.Cart = cartService.GetCartCurrent(this);
        cartService.SaveCartItem(cartItem);

       //bla bla bla

     }