将 Javascript ES6 Map() 传递给 MVC 控制器

Pass a Javascript ES6 Map() to an MVC Controller

我正在使用 ES6 中的 Map() 功能来创建密钥对值列表,将 ID 号设为布尔值。我想将此 Javascript 对象传递给 MVC 4 控制器。

这是我的 Javascript:

var bankHolidays = new Map();
$('.bank-holiday-switch').each(function () {
    var id = $(this).attr('id');
    var isChecked = $(this).is(':checked');
    bankHolidays.set(id, isChecked);
});

$.ajax({
    url: '/AdminPanel/Settings/SaveBankHolidays',
    type: 'POST',
    data: { bankHolidays: bankHolidays },
    success: function (result) {
        alert("Success");
    }
});

我可以 console.log() 地图对象并看到它是按预期创建的。但是,当我将它传递给这个 MVC 控制器时:

[HttpPost]
public JsonResult SaveBankHolidays(Dictionary<int, bool> bankHolidays)
{
   // DO stuff
}

..没有抛出错误,但它只是说 bankHolidays 字典中有 0 个值。我可以毫无问题地调用该控制器中的其他操作。我尝试了很多不同的 Dictionary<string, bool> 组合都无济于事。

有人能告诉我我做错了什么吗?

在 http 协商中,xhr 在这种情况下,我们必须发送字符串,所以你需要一些 Map() 的字符串表示,在我看来,最好的选择是使用 JSON以某种方式进行字符串化,因为 JSON 的解析在服务器端代码中得到广泛支持:

var bankHolidays = new Map();

bankHolidays.set(1, 2);
bankHolidays.set(3, 4);

var result = JSON.stringify([...bankHolidays]);

console.log(result)

在您的代码中类似于:

$.ajax({
    url: '/AdminPanel/Settings/SaveBankHolidays',
    type: 'POST',
    data: JSON.stringify([...bankHolidays]),
    success: function (result) {
        alert("Success");
    }
});

在后端你必须解析响应,见