MVC4 - Saat Melewati model Kompleks ke Kontroler menggunakan Ajax

Ini adalah fungsi Java Script yang dipanggil ketika pengguna mengklik tambahkan ke keranjang, saya menguji panggilan Ajax saya sebelum saya memasukkan semua logika saya untuk membangun nilai yang benar dari formulir saya, (kode yang sangat sulit untuk saat ini.)

    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");
        }
    });
}

Masalahnya adalah ketika menguji Java Script ini, parameter saya yang diketik dengan kuat di dalam tindakan pengontrol saya hanya memiliki beberapa nilai yang ditetapkan, Tindakan pengontrol saya terlihat seperti ini:

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

       //bla bla bla

     }

Definisi Item Keranjang terlihat seperti ini:

[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; }

}

Jadi ketika saya menetapkan break-point CartItem.Quaintity = 1 tetapi CartItem.Product BUKAN NULL tetapi nilai Product.Id = 0 dan Product.Price adalah 0.

Mengapa??

Bagaimana Anda mengatur objek bagian dalam model kompleks.

Ada ide?


person Ayo Adesina    schedule 08.03.2014    source sumber


Jawaban (1)


Masalahnya sepertinya data Anda tidak dideserialisasi dengan benar. Anda dapat menggunakan JavaScriptSerializer untuk mengatasi ini.

Di Sini

  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
Hampir... Ketik 'AsoRock.Entities.Product' tidak didukung untuk deserialisasi array. ada ide? - person Ayo Adesina; 09.03.2014
comment
Ini mungkin terjadi karena Kelas Produk tidak cocok dengan objek serial. Bisakah Anda memposting Objek Produk Anda? Coba juga gunakan [Serializable] pada produk - person Lokesh Suthar; 09.03.2014
comment
Catatan: Saya baru saja mengujinya sendiri dan sudah menjadi serial. - person Lokesh Suthar; 09.03.2014
comment
[Dapat diserialkan] public class Product { //[Kunci] public int Id { get; mengatur; } string publik Nama Produk { dapatkan; mengatur; } harga desimal publik { dapatkan; mengatur; } Kategori virtual publik Kategori { dapatkan; mengatur; } } - person Ayo Adesina; 09.03.2014
comment
Ya, saya memeriksa dengan bentuk Produk yang lebih sederhana dan berhasil, jadi itu berarti ada hal lain yang salah. - person Lokesh Suthar; 09.03.2014
comment
Mungkin saya perlu menentukan kategorinya juga? - person Ayo Adesina; 09.03.2014
comment
Tidak, tidak menentukan kategori seharusnya tidak menjadi masalah. Bisakah Anda memeriksa ulang kode Anda jika ada nama properti yang tidak cocok? Edit juga pertanyaan Anda dan posting kelas produk Anda di sana. - person Lokesh Suthar; 09.03.2014
comment
Saya pikir saya punya masalahnya. Apakah Anda kebetulan menggunakan ini? var myproduct = { Id: 1, Price: 17, ProductName: "product name" }; ? Lihat produk di caritem Anda bukan array, jadi mengapa Anda harus meneruskannya sebagai array? - person Lokesh Suthar; 09.03.2014
comment
Atau opsi kedua adalah mengubah ` public virtual Product Product { get; mengatur; }` ke public virtual List<Product> Product { get; set; } - person Lokesh Suthar; 09.03.2014
comment
Itu akan menjadi masalahnya.. Saya tidak menyadari bahwa saya melewatkan sebuah array untuk produk. Saya pikir saya melewatkan satu objek, bagaimana seharusnya? - person Ayo Adesina; 09.03.2014
comment
Ya...Hak Anda...produknya arrrary..!! Ahhhhhhhh! - person Ayo Adesina; 09.03.2014
comment
Terima kasih Sobat.. Senang rasanya mendapat bantuan dari sembarang orang di internet :-) Twitter..?? Ikuti saya ››@mcDarke - person Ayo Adesina; 09.03.2014
comment
Dan itu bagus... Pertanyaan... Anda harus benar-benar memilihnya :-) - person Ayo Adesina; 09.03.2014
comment
ok Bagaimana cara mengisi Koleksi.. .Produk berfungsi sekarang.. tetapi bagaimana cara mengisi SelectedProductOptions dengan koleksinya, apakah saya memetakannya ke array objek JSON? - person Ayo Adesina; 09.03.2014
comment
mari kita melanjutkan diskusi ini di chat - person Ayo Adesina; 09.03.2014