发布到mvc actionresult时,Json数组对象始终为空

时间:2013-10-24 17:34:00

标签: c# javascript asp.net-mvc json asp.net-mvc-4

我的原始json字符串通过AJAX post

传递给MVC ActionResult控制器
{"ID":0,"RoutingRuleID":24,"ConditionalType":0,"Field":"Channel","ConditionalOperator":"5","Values":[1,9],"ValueString":""}

但最终发生的事情是,一旦json对象进入MVC控制器,它就会丢失关联数组“值”中的值。其他属性设置正确。

我在C#中的模型类如下:

    public class RoutingConditional 
    {
      public int ID { get; set; }
      public int ParentID { get; set; }

      public string ConditionalType { get; set; }

      public string Field { get; set; }

      public string ConditionalOperator { get; set; }

      public List<string> Values { get; set; }
      public string ValueString{get;set;}
      public RoutingConditional()
      {
        //this.Values = new List<string>(); //I tried to initialize it too did not work
       }
    }

我的MVC控制器

    [HttpPost]
    public ActionResult EditConditional(RoutingConditional rcview)
    {
        //rcview.Values = null
    }

我的Javascript

     $.ajax({
        url: actionURL,
        type: "post",
        dataType: 'json',
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify(myModel.RoutingConditional),
        ........standard success and error
        });

为什么它被作为null传递给数组(List)?

2 个答案:

答案 0 :(得分:6)

这是一个奇怪的,不确定我可以完全解释(有一个想法),但这就是我做的。 除了"Values":[1,9]之外,在有效负载中删除了所有json参数,它工作得很好。

所以开始从最后开始添加每个json参数(幸运的是)。当我重新添加"ValueString":""时,它再次被淘汰出局。 因此,添加了一些json参数,以查看它是否是一个排序问题(例如,没有任何东西可以在数组之后)。情况并非如此。

所以我开始重命名这些内容,当我将"ValueString":""重命名为"TmpValueString":""时,它再次发挥作用。

这是我最好的猜测。 ValueString这个单词的名称与第一个字符的另一个属性相匹配。在这种情况下,“ values -tring”与“ values ”(数组名称)匹配,从而在与对象模型匹配时抛弃MVC活页夹。我不是百分之百,但这就是它的样子。

所以你的解决方案是重命名你的一个道具,使它的名字不构成另一个道具的第一个角色。

另外,想提及ConditionalOperator和ConditionalType名称来反驳任何参数。这些名称的独特之处在于它们不是彼此的子集,而只是包含相同的字符。而值是Valuestring的一个子集,因此我认为这会引起混淆。

答案 1 :(得分:2)

尝试设置“traditional”选项

$.ajax({
        url: actionURL,
        type: "post",
        dataType: 'json',
        traditional: true,
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify(myModel.RoutingConditional),
        ........standard success and error
        });