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 Script นี้ พารามิเตอร์ที่พิมพ์อย่างเข้มงวดของฉันภายในการกระทำของคอนโทรลเลอร์ของฉันมีค่าที่ตั้งไว้เพียงบางส่วนเท่านั้น การกระทำของคอนโทรลเลอร์ของฉันมีลักษณะดังนี้:

[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
อาจเกิดขึ้นเนื่องจากระดับผลิตภัณฑ์ไม่ตรงกับวัตถุที่ทำให้เป็นอนุกรม คุณสามารถโพสต์ Product Object ของคุณได้หรือไม่? ลองใช้ [Serializable] กับผลิตภัณฑ์ด้วย - person Lokesh Suthar; 09.03.2014
comment
หมายเหตุ: ฉันเพิ่งทดสอบด้วยตัวเองและกำลังได้รับการจัดอันดับ - person Lokesh Suthar; 09.03.2014
comment
[อนุกรม] ผลิตภัณฑ์คลาสสาธารณะ { //[คีย์] รหัส int สาธารณะ { รับ; ชุด; } 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 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
ขอบคุณเพื่อน.. รู้สึกดีที่ได้รับความช่วยเหลือจากบุคคลที่สุ่มบนอินเทอร์เน็ต :-) Twitter..?? ติดตามฉัน>>@mcDarke - person Ayo Adesina; 09.03.2014
comment
และมันก็ดี... คำถาม... คุณควรลงคะแนนให้จริงๆ :-) - person Ayo Adesina; 09.03.2014
comment
ตกลง ฉันจะเติมคอลเลกชันได้อย่างไร .. . ผลิตภัณฑ์ทำงานตอนนี้ .. แต่ฉันจะเติม SelectedProductOptions ได้อย่างไร มันเป็นคอลเลกชัน ฉันจะแมปมันกับอาร์เรย์ของวัตถุ JSON ได้อย่างไร - person Ayo Adesina; 09.03.2014
comment
ให้เรา สนทนาต่อในการแชท - person Ayo Adesina; 09.03.2014