Объект массива Json всегда пуст, когда отправляется в mvc actionresult

Моя строка raw json передается в контроллер MVC ActionResult через сообщение AJAX

{"ID":0,"RoutingRuleID":24,"ConditionalType":0,"Field":"Channel","ConditionalOperator":"5","Values":[1,9],"ValueString":""}

Но то, что заканчивается, заключается в том, что, как только объекты json попадают в контроллер MVC, он теряет значения в "Значениях" связанного массива. Другие свойства установлены правильно.

Моя модель класса в С# выглядит следующим образом:

    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)?

Ответ 1

Это странно, но я не могу полностью объяснить (есть идея), но вот что я сделал. Удалил все ваши json-параметры в полезной нагрузке, кроме "Values":[1,9], и все получилось просто отлично.

Итак, началось добавление обратно каждого json-параметра, начиная с конца (к счастью). Когда я снова добавил "ValueString":"", он снова исчез. Поэтому добавлено еще несколько json params, чтобы увидеть, была ли проблема с упорядочением (например, после массива ничего не осталось). Это было не так.

Итак, началось переименование, и когда я переименовал "ValueString":"" в нечто вроде "TmpValueString":"", он снова работал.

Вот мое лучшее предположение. Слово ValueString имеет фрагменты имени, которые соответствуют первым символам другого свойства. В этом случае " значения -tring" соответствуют " значениям" (имя массива), тем самым отбрасывая связующее MVC, когда оно идет, чтобы соответствовать вашей объектной модели. Я не на это 100%, но это то, что кажется.

Итак, ваше решение состоит в том, чтобы переименовать один из ваших реквизитов, чтобы его имя не составляло первые символы другой опоры.

Кроме того, хотелось бы упомянуть имена ConditionalOperator и ConditionalType для противодействия любым аргументам. Эти имена уникальны тем, что они не являются подмножествами друг друга, а содержат только символы. В то время как значения являются подмножеством Valuestring, что вызывает, как мне кажется, обязательную путаницу.

Ответ 2

Попробуйте установить параметр традиционный

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