Переданная коллекция JSON не обнаружена контроллером - PullRequest
4 голосов
/ 13 января 2012

У меня есть следующий фрагмент JavaScript:

$.ajax({
            url: self.LoadCirculationListUrl,
            cache: false,
            async: false,
            dataType: 'json',
            contentType: 'application/json; charset=utf-8',
            data: [ { "ColumnName":"France","Comparitor":"=","Value":"1"},{"ColumnName":"Germany","Comparitor":">","Value":"3"}] 
        });

Вот управляющий элемент, доступ к которому осуществляется из вышеуказанного вызова ajax:

public ActionResult LoadCirculationData(IList<CirculationListFilter> filters)
{
}

Вот класс CirculationListFilter

public sealed class CirculationListFilter
{
    public string ColumnName { get; set; }

    public string Comparitor { get; set; }

    public string Value { get; set; }
}

Теперь, когда я запускаю код, контроллер не передает ему коллекцию JSON; filters всегда равно нулю. Однако, если я сделаю это:

$.ajax({
            url: self.LoadCirculationListUrl,
            cache: false,
            async: false,
            dataType: 'json',
            contentType: 'application/json; charset=utf-8',
            data: { "ColumnName":"Germany","Comparitor":">","Value":"3"}
        });

и контроллер выглядит так:

public ActionResult LoadCirculationData(CirculationListFilter filters)
{
}

Данные передаются нормально. Почему контроллер не может связать коллекцию элементов JSON?

EDIT:

Я изменил вызов AJAX, чтобы использовать это:

data: { filters: [{ "ColumnName": "France", "Comparitor": "=", "Value": "1" }, { "ColumnName": "Germany", "Comparitor": ">", "Value": "3" }]},

и ActionResult:

public ActionResult LoadCirculationData(List<CirculationListFilter> filters)

Теперь filters содержит 2 элемента, но каждый из классов CirculationListFilter заполнен данными NULL в своих свойствах. Так что я все ближе, но фактические значения не связаны.

Ответы [ 3 ]

4 голосов
/ 13 января 2012

Проблема в вызове .ajax ().

.ajax () не преобразует данные в строку JSON.

Причина, по которой это работает для одного элемента, заключается в том, что.ajax () смог преобразовать данные в строку запроса, которую MVC с радостью принял.

Решение - сначала преобразовать JSON в строку:

$.ajax({
            url: self.LoadCirculationListUrl,
            cache: false,
            async: false,
            dataType: 'json',
            contentType: 'application/json; charset=utf-8',
            data: JSON.stringify([ { "ColumnName":"France","Comparitor":"=","Value":"1"},{"ColumnName":"Germany","Comparitor":">","Value":"3"}]) 
        });
0 голосов
/ 13 января 2012

Если вы хотите получить в этом формате

public ActionResult LoadCirculationData(IList<CirculationListFilter> filters)
{
}

Вам необходимо опубликовать его в следующем формате данных: {

{
"ColumnName[0]":"Germany","Comparitor[0]":">","Value[0]":"3",
"ColumnName[1]":"Germany","Comparitor[1]":">","Value[1]":"3",
"ColumnName[2]":"Germany","Comparitor[2]":">","Value[2]":"3",
"ColumnName[3]":"Germany","Comparitor[3]":">","Value[3]":"3",
"ColumnName[4]":"Germany","Comparitor[4]":">","Value[4]":"3",
}
0 голосов
/ 13 января 2012

Я нашел другое решение:

Ajax call:

data: { 'json': '[{ "ColumnName": "France", "Comparitor": "=", "Value": "1" }, { "ColumnName": "Germany", "Comparitor": ">", "Value": "3" }]' },

Контроллер:

public ActionResult LoadCirculationData(string json)
{
    JavaScriptSerializer js = new JavaScriptSerializer();

    var obj = js.Deserialize<List<CirculationListFilter>>(json);
}

Выше приведены вещи, которые мне нужны. На самом деле не уверен, почему механизм связывания JSON не делает этого по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...