jQuery AJAX不发送数据

时间:2018-06-11 12:18:28

标签: jquery asp.net-ajax

这是我的jQuery / JS代码:

var selectedMonths = [];
var selectedLocations = [];
var selectedEvents = [];

$("#filter").click(function ()
{
    $('#months li').each(function ()
    {
        if ($(this).find('input[type=checkbox]').is(':checked'))
        {
            selectedMonths.push($(this).find('a').attr('data-value'));
        }
    });

    $('#locations li').each(function () {
        if ($(this).find('input[type=checkbox]').is(':checked')) {
            selectedLocations.push($(this).find('a').attr('data-value'));
        }
    });

    $('#events li').each(function () {
        if ($(this).find('input[type=checkbox]').is(':checked')) {
            selectedEvents.push($(this).find('a').attr('data-value'));
        }
    });

    var months = { months: selectedMonths };

    $.ajax({
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        type: 'POST',
        url: '/Shop/FilterRinglet',
        data: months,
        traditional: true,
        success: function (result) {
            alert("success");
        },
        failure: function (response) {
            alert(response);
        }
    });
});

这是我的简单控制器:

[HttpPost]
public ActionResult FilterRinglet(List<string> months)
{
    return Json(new { x = "sdg", received = "ok" });
}

但Chrome DevTools仅显示500 - 内部服务器错误。

我想向该控制器发送三个字符串数组(例如,您只看到发送一个的尝试)。

我试过这个(How can I post an array of string to ASP.NET MVC Controller without a form?)并可能有其他答案。我不能让这个工作,请你告诉我我的错误隐藏在哪里?

修改 我还尝试了以下代码行

var months = JSON.stringify({ months: selectedMonths });

selectedMonths看起来像这样

enter image description here

这不会导致500,但在控制器中看起来像这样:

enter image description here

EDIT2: 我也尝试了这个:

        $.post('/Shop/FilterRinglet', { 'months[]': selectedMonths }, function (response) {
            alert(response);
        });

但除""之外的任何内容都不会到达控制器。

EDIT3:

我改变了

[HttpPost]
public ActionResult FilterRinglet(List<string> months)

[HttpPost]
public ActionResult FilterRinglet(string[] months)

但仍未成功。

Edit4:

我还创建了一个类

public class RingletData
{
    public List<string> months { get; set; }
}

并相应地改变了方法。月仍然是""

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用JSON.stringify并将传统设置为false。我不相信那些一起工作。

(我会留下这个评论,但我没有足够的代表。)

答案 1 :(得分:0)

因此,经过数小时的研究并结合不同的方法,我提出了以下解决方案:

// old line, needs to be changed: var months = { months: selectedMonths };
// new line, already contains the other arrays:
var data = JSON.stringify({ months: selectedMonths, locations: selectedLocations, events: selectedEvents });

$.ajax({
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    type: 'POST',
    url: '/Shop/FilterRinglet',
    data: data,
    traditional: true,
    success: function (result) {
        alert("success");
    },
    failure: function (response) {
        alert(response);
    }
});

控制器:

    [HttpPost]
    public ActionResult FilterRinglet(RingletData data)
    {
        ...
    }

重要的是,如果您使用JSON.stringify(...),请不要忘记contentType: "application/json"。这是我的错误,因为在我不同的试验和错误中我忘了使用它 - 但我不知道在使用JSON.stringify(...)

时这是必要的

另外你应该创建一个对象,比如我的RingletData

public class RingletData
{
    public string[] months { get; set; }
    public string[] locations { get; set; }
    public string[] events { get; set; }
}

然后,您可以使用data.months

访问您发送的数据