2011-03-12 35 views
17

我在ASP.Net MVC 3中,並支持at中的功能列表,我應該能夠獲得默認的json模型綁定。不過,我還沒有成功地從json綁定數組/集合到action方法參數。儘管我確實得到了簡單的json對象綁定,如果這裏的專家能告訴我我做錯了什麼,我將不勝感激。ASP.Net MVC 3 - JSON模型綁定到數組

下面是代碼:

服務器端代碼第一:

//操作方法

public JsonResult SaveDiscount(IList<Discount> discounts) 
    { 
     foreach(var discount in discounts) 
     { 
     .... 
     } 
    } 

//視圖模型

public class Discount 
{ 
    string Sku{get; set;} 
    string DiscountValue{get; set;} 
    string DiscountType{get; set;} 

} 

//客戶端(jQuery的/ js):

var discount = {}; 
    var jsondatacoll = []; 
    $('#discountgrid tr').each(function() { 

     sku = $(this).find("td").eq(1).html(); 
     discValue = $(this).find('.discval').val(); 
     discType = $(this).find('.disctype').val(); 

     discount = { Sku: sku, DiscountType: discType, DiscountValue: discValue}; 
     jsondatacoll.push(discount); 
     } 
    }) 
    if (jsondatacoll.length > 0) { 
     var catalogDiscount = JSON.stringify(jsondatacoll); 

     $.ajax(
     { 
      url: '/url/savediscount', 
      type: 'POST', 
      data: catalogDiscount, 
      dataType: 'json', 
      contentType: 'application/json; charset=utf-8', 
      success: function (data, textStatus, jqXHR) { 
       ...     
      }, 
      error: function (objAJAXRequest, strError) {     
       ... 
      } 
     } 
    ); //ajax 
    } 

我做檢查的JSON有效載荷的小提琴手,它看起來象下面這樣:

[ 
    {"Sku":"sku1","DiscountType":"type1","DiscountValue":"10"},  
    {"Sku":sku2","DiscountType":"type1","DiscountValue":"12"}, 
    {"Sku":"sku3","DiscountType":"type2","DiscountValue":"40"} 
] 

和服務器端我看到的IList<Discount>折扣已經填充了3個空Discount對象 - 這意味着該屬性爲null但折扣參數的長度爲3

+15

您的模型的屬性應該標記爲「public」。錯字或疏忽? – 2011-03-12 18:49:36

+0

哇!這是一個疏忽!你想要輸入這個答案,以便我可以標記它嗎? :) – thanikkal 2011-03-12 18:55:23

+5

感謝您的帖子的其餘部分是正確的(除了那些缺少'公共'),我注意到使用JSON.stringify設置contentType,它使所有不同。與此掙扎了好幾個小時!謝謝! – 2011-09-19 18:10:14

回答

14

由於Cresnet Fresh在問題的評論中正確指出模型屬性必須標記爲public。

所以修改Discount類如下解決了這個問題。

public class Discount 
{ 
    public string Sku{get; set;} 
    public string DiscountValue{get; set;} 
    public string DiscountType{get; set;} 

} 
+0

任何人都可以解釋(或更好地鏈接到一個解釋)至於爲什麼這必須是這種情況?我認爲,因爲首先創建一個空對象(因此需要無參數構造函數),然後設置屬性,但我更喜歡在事實上工作,而不是推定。 – RyanfaeScotland 2015-01-27 16:36:13

-1

您的代碼看起來不錯。但檢查這個

  1. 路由設置。在SaveDiscount

  • 認沽[HttpPost]屬性,並嘗試這個

    var catalogDiscount = JSON.stringify({ discounts: jsondatacoll }); 
    

    ,會給做出正確的數據綁定。

  • +0

    感謝在這裏回答。正如上面評論中所解釋的那樣,我錯過了將我的viewmodel屬性標記爲public。 – thanikkal 2011-03-14 02:24:19

    11

    @thanikkal回答此問題的討論,我有同樣的症狀,一個非常類似的設置。

    ,而不是在我的模型public{ get; set; }導致模型綁定到不行,它實際上是我的jQuery方法! (RAWR!)

    我使用的是$.post(它不起作用)而不是$.ajax


    不起作用:

    $.post("/Games/Action", 
        { "userId": "1", "listName": [ { "fooId": "2", "barId": "99" } ] }, 
        'json', 
        true 
    ); 
    

    的值是在Form.Data [],但沒有正確映射。


    作品:

    $.ajax(
        { 
         url: '/Games/Action', 
         type: 'POST', 
         data: JSON.stringify({ userId: "1", listName: [ { fooId: 2, barId: 99 } ] }), 
         dataType: 'json', 
         contentType: 'application/json; charset=utf-8', 
         success: function (data, textStatus, jqXHR) 
         { 
          console.log(data); 
         }, 
         error: function (objAJAXRequest, strError) 
         { 
          console.log(data); 
         } 
        }); 
    

    正確映射所有值。


    失去了幾個小時到這一個,希望這可以幫助別人。

    +2

    我可以證實以上是真的。我正在使用$ .post,而當我看到一個數組正在我的模型中填充時,值全爲空。切換到$ .ajax解決了這個看起來很奇怪的問題。我使用MVC 4,jQuery 2.0.2 – 2013-08-08 09:12:37

    +0

    這是一個救生員。非常感謝。 – 2013-08-20 18:17:58

    +0

    非常感謝!我失去了近5個小時! – Aviatrix 2013-10-31 16:08:58