2011-03-12 93 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