Объект массива 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
});