Используя 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"
}),
И даже в этом простом примере с двумя строкамине работает.