我希望传入MVC 5控制器的Json如下:
var searchInputs = { "Id": [ "1", "2" ] };
如您所见,它只是一个名为Id的字符串数组。
我创建了一个应该接收这个数组的类。
public class SearchList
{
public SearchList()
{
Id = new List<string>();
}
public List<string> Id { get; set; }
}
控制器定义为:
[HttpPost]
public FilePathResult DownloadSelectedPDF(SearchList data)
{
...
}
不会抛出任何错误,但控制器不会获取数据,但会返回零集合。
根据请求,我添加了Ajax调用。
$.ajax({
url: url,
method: 'POST',
dataType: "json",
data: data,
success: function (result) {
console.log();
if (result.Success) {
console.log("ajax: result successful");
if (result.SuccessMessage !== null)
showSuccess(result.SuccessMessage);
successCallBack(result.Data);
} else {
console.warn("ajax: result unsuccessful");
showError(result.ErrorMessage);
failCallBack(result.ErrorMessage);
}
},
error: function (jqXHR, textStatus, errorThrown) {
if (!supressWaitingPopup)
waitingModal(false);
console.warn("ajax error");
showError(errorThrown);
failCallBack(errorThrown);
}
});
数据是searchInputs varaiable。
更新:
searchInput可以有倍数,所以我应该将它定义为:
var searchInputs = { "Id": [ "1", "2", ... ] };
进一步更新:
我使用了ajax params建议,两者一起和分开。
使用相同的ajax调用,如果存在这些参数,则使用此结构的调用将失败:
this.JsonData = {
"__RequestVerificationToken": $('input[name=__RequestVerificationToken]').val(),
"searchMode":
{
"mode": Number(mode.val()),
"pageSize": Number(pagesize.val()) || 5, //Initial Page Size Set Here
"pageNumber": Number(pagenumber.val()) || 1, //Start on page one
"sortField": sortfield.val() || "PODRef",
"sortDirection": sortdirection.val() || "desc"
},
"searchData":
{
"Compare": Number(StdComparison.val()),
"SearchTextFrom": searchText.val(),
"SearchTextTo": searchTextTo.val()
}
如果我JSON.stringify数据,这是真的。
答案 0 :(得分:0)
var obj = { pVar: val, pVar1: val1 };
$.ajax({
type: "POST",
url: '@Url.Action("DownloadSelectedPDF", "Controller")',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(obj),
dataType: 'json',
success: function (data) {
$("#divID").html(data.Html);
},
error: errorFunc
});
[HttpPost]
public FilePathResult DownloadSelectedPDF(string pVar, string pVar1)
{
return Json(new { Html = "someStuff")});
}
答案 1 :(得分:0)
好的,我找到了一个解决方案,可以让我的NOT必须将contentType或tradional的参数添加到ajax调用中。
var searchInputs = { "Id": [ "1", "2", ... ] };
这是一个字符串对象数组,所以我所做的是将它改为:
var postData = { Id: _self.Array }
然后,只需将控制器上的参数更改为
即可List<string> Id
注意:参数名称与为数组
指定的名称相匹配那就是它。我知道这个解决方案不是基于Json的,但它可以工作并让我走出困境。
非常感谢所有关注此事的人,特别感谢d.popov对此贡献: how-can-i-post-an-array-of-string-to-asp-net-mvc-controller-without-a-form
答案 2 :(得分:0)
你试过这个吗?
[HttpPost]
public FilePathResult DownloadSelectedPDF([FromBody]SearchList data)
{
...
}
值得将此添加到您的ajax调用中:
contentType: "application/json; charset=utf-8",
我在我的控制器中使用它并且我收到一个初始化对象(如果发送者不包含“property”:“value”对,则某些属性为null。)
我不确定如何处理List<string>
。如果该属性为null,则可以尝试将其更改为string[]
,以查看它是否有效。