массив строк не проецируется должным образом при передаче с ajax - PullRequest
0 голосов
/ 12 июня 2018

Используя ajax, я хочу передать 2 объекта: string[] и Options моему контроллеру.Проблема в том, что каждый раз string[] в области действия контроллера устанавливается на null.

Вот код js:

$("#exportCsv").click(function () {
    var checkboxes = $('.TableChBox:checkbox:checked');
    var allIds = [];
    for (var i = 0, n = checkboxes.length; i < n; ++i) {
        var el = checkboxes[i];
        if (el.id) {
            allIds.push(el.id);
        }
    }
    console.log(allIds); // it prints ["RId1604678", "RId1604679"]

    var form = $('#SearchForm').serialize();

    $.ajax({
        url: '@Url.Action("ExportToCsv", "Bank")',
        type: 'POST',
        data: JSON.stringify({
            ids: allIds,
            options: form
        }),

        dataType: 'json',
        error: function (xhr) {
            alert('Error: ' + xhr.statusText);
        },
        async: true,
    });
});

И вот код c #:

public void ExportToCsv(string[] ids, Options options)
{
    // ids is null here
    // options is not null
}

Когда я использую отладчик, я вижу, что options успешно заполнен, ноids равно нулю.Почему это происходит?

Редактировать 1

Как кто-то предложил мне добавить contentType.Поэтому я добавил:

url: '@Url.Action("ExportToCsv", "Bank")',
type: 'POST',
contentType: "application/json; charset=utf-8",

И все же - ids не равно нулю, но options равно.

Редактировать 2

Кто-то предложил изменить два параметра вфункция к одному.Поэтому я изменил свой код на:

часть контроллера

public class ExportModel
{
    [JsonProperty(PropertyName = "one")]
    public string One { get; set; }

    [JsonProperty(PropertyName = "two")]
    public string Two { get; set; }
}

[System.Web.Mvc.HttpPost]
public void ExportToCsv([System.Web.Http.FromBody] ExportModel model)
{
    //model.One is null
    //model.Two is null
}

часть js кода

data: JSON.stringify({
    one: "foo",
    two: "bar"
}),

И даже в этом простом примере с двумя строкамине работает.

Ответы [ 2 ]

0 голосов
/ 21 июня 2018

Вы должны использовать список строк вместо массива и попробовать.

public List<string> Ids {get;set;}
0 голосов
/ 12 июня 2018

В вашем методе контроллера вы должны заявить, что он принимает модель, подобную следующей:

public void ExportToCsv(ExportModel model)
{

}

, а затем определить свою модель следующим образом:

public class ExportModel
{
    [JsonProperty(PropertyName = "ids")]
    public string[] Ids {get;set;}

    [JsonProperty(PropertyName = "options")]
    public Options Options {get;set;}
}

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

$("#exportCsv").click(function () {
    var checkboxes = $('.TableChBox:checkbox:checked');
    var allIds = [];
    for (var i = 0, n = checkboxes.length; i < n; ++i) {
        var el = checkboxes[i];
        if (el.id) {
            allIds.push(el.id);
        }
    }
    console.log(allIds); // it prints ["RId1604678", "RId1604679"]

    var form = $('#SearchForm').serialize();

    $.ajax({
        url: '@Url.Action("ExportToCsv", "Bank")',
        type: 'POST',
        data: JSON.stringify({
            ids: allIds,
            options: form
        }),
        contentType: 'application/json',
        dataType: 'json',
        error: function (xhr) {
            alert('Error: ' + xhr.statusText);
        },
        async: true,
    });
});

Если вы не объявите тип содержимого, по умолчанию будет application/x-www-form-urlencoded; charset=UTF-8

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