Json数据数组和传递给mvc控制器的正确方法

时间:2017-02-17 11:23:53

标签: c# arrays json asp.net-mvc

我希望传入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数据,这是真的。

3 个答案:

答案 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[],以查看它是否有效。