MVC4 — при передаче сложной модели контроллеру с использованием Ajax

Это функция Java Script, которая вызывается, когда пользователь нажимает кнопку «Добавить в корзину». Я проверяю свой вызов 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.

Почему??

Как вы устанавливаете внутренний объект сложной модели.

Любые идеи?


person Ayo Adesina    schedule 08.03.2014    source источник


Ответы (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

     }
person Lokesh Suthar    schedule 08.03.2014
comment
Почти... Тип AsoRock.Entities.Product не поддерживается для десериализации массива. Любые идеи? - person Ayo Adesina; 09.03.2014
comment
Вероятно, это происходит из-за того, что класс продукта не соответствует сериализованному объекту. Можете ли вы опубликовать свой объект продукта? Также попробуйте использовать [Serializable] для продукта - person Lokesh Suthar; 09.03.2014
comment
Примечание. Я только что протестировал его сам, и он сериализуется. - person Lokesh Suthar; 09.03.2014
comment
[Сериализуемый] public class Product { //[Key] public int Id { get; установлен; } общедоступная строка ProductName { получить; установлен; } публичная десятичная цена { получить; установлен; } публичная виртуальная категория Категория { получить; установлен; } } - person Ayo Adesina; 09.03.2014
comment
Что ж, я проверил более простую форму продукта, и это сработало, так что это должно означать, что что-то еще не так. - person Lokesh Suthar; 09.03.2014
comment
Может быть, мне нужно указать категорию, а? - person Ayo Adesina; 09.03.2014
comment
Нет, не указание категории не должно быть проблемой. Можете ли вы перепроверить свой код, если какие-либо имена свойств не совпадают? Также отредактируйте свой вопрос и разместите там свой класс продукта. - person Lokesh Suthar; 09.03.2014
comment
Я думаю, что у меня проблема. Вы случайно этим не пользуетесь? var myproduct = { Id: 1, Price: 17, ProductName: "product name" }; ? Видите, что продукт в вашей корзине не является массивом, так почему вы должны передавать его как массив? - person Lokesh Suthar; 09.03.2014
comment
Или второй вариант — изменить `public virtual Product Product { get; установлен; }` до public virtual List<Product> Product { get; set; } - person Lokesh Suthar; 09.03.2014
comment
Это было бы проблемой. Я не понимал, что передаю массив для продукта, я думал, что передаю один объект, как это должно быть? - person Ayo Adesina; 09.03.2014
comment
Да...Ваше право...товар - это редкость..!! Аххххххх! - person Ayo Adesina; 09.03.2014
comment
Спасибо, приятель.. Приятно получить помощь от случайного человека в Интернете :-) Твиттер..?? Следуй за мной ››@mcDarke - person Ayo Adesina; 09.03.2014
comment
И это хорошо... Вопрос... Вы действительно должны проголосовать за него :-) - person Ayo Adesina; 09.03.2014
comment
ok Как мне заполнить коллекции.. .Product работает сейчас.. но как мне заполнить SelectedProductOptions его коллекцией, я могу сопоставить ее с массивом объектов JSON? - person Ayo Adesina; 09.03.2014
comment
давайте продолжим это обсуждение в чате - person Ayo Adesina; 09.03.2014