将字符串数组发布到 .net-core mvc

3

问题:

我试图通过jquery post发送一个字符串数组,但它们无法被正确解析,列表中只得到了null。

javascript:

var array = [];
array.push("test")
array.push("test2")
array.push("tes3")

$.post("Admin/FilteredKeys", $.param(JSON.stringify({ Ids: array, OnlyActive: true }, true)));

C# 模型:

public class MySearch
{
    public bool OnlyActive { get; set; } = true;
    public List<string> Ids { get; set; }
}

控制器中的操作:

public async Task<IActionResult> FilteredKeys(MySearch filter)
{
    var data = await _service.GetFilteredKeyTypes(filter);
    return View();
}

我在Google上搜索发现传统属性需要设置为true,但它仍然保持不变。我也尝试了这段代码:

$.ajax({
    type: "POST",
    url: "Admin/FilteredKeys",
    data: postData,
    success: function(data){
        alert(data.Result);
    },
    dataType: "json",
    traditional: true
});

这是一个 .net core 项目,我需要在哪里改变一些额外的参数吗?

编辑:

忘记补充了,我的原始尝试是这样的:

$.Admin.worker.postJson("Admin/FilteredKeys", JSON.stringify({ Ids: array, OnlyActive: true }), function (data) {
    var t = "";
});

postJson: function (url, data, callback) {
    $.LoadingOverlay("show");
    $.ajax({
        url: url,
        type: 'POST',
        data: data,
        contentType: 'application/json; charset=utf-8',
        success: function (data) {
            if (callback)
                callback(data);
            $.LoadingOverlay("hide");
        },
        error: function (event, jqxhr, settings, thrownError) {
            //$.helpers.errorHandler($("#fileDialogErrors"), event.responseText);
            $.LoadingOverlay("hide");
        }
    });
}

1
没有测试过,但是我建议在ajax中使用data: { filter : postData },因为我遇到并解决了类似的问题。 - Hikarunomemory
我的隐秘怀疑是与您将一个字符串化的对象作为参数的位置有关:$.param(JSON.stringify({ Ids: array, OnlyActive: true }。您是否尝试过直接将该对象作为POST数据进行提交?例如:{ Ids: array, OnlyActive: true } - Geoff James
5个回答

3

因为我认为被接受的答案不正确,这里给出另一种替代方法(与其他答案类似,但不完全相同)。首先,您需要使用FromBody属性装饰模型:

public async Task<IActionResult> FilteredKeys([FromBody] MySearch filter)
{
    var data = await _service.GetFilteredKeyTypes(filter);
    return View();
}

一个ajax调用应该长这样:

var array = [];
array.push("test")
array.push("test2")
array.push("test3")
 $.ajax({
    type: "POST",
    url: "Admin/FilteredKeys",
    data: JSON.stringify({ Ids: array, OnlyActive: true}),
    contentType: "application/json; charset=utf-8",
    success: function(data){
        // ...
    },
    failure: function(errMsg) {
        // ...
    }
});

1
为什么不只是这样:

  $.post("Admin/FilteredKeys",{ Ids: JSON.stringify(array), OnlyActive: true });

我也是这么想的,Manoj :) 只是我认为如果你能稍微解释一下你的答案,可能会对大家有所帮助。 - Geoff James
1
@Keith - 我知道。也许我表达不够清楚。我的意思是,如果能解释为什么现有的代码不能工作,以及这种差异的原因,那么答案就会更完整、更易懂,适用于所有用户。 - Geoff James
1
它将整个数组转换为一个字符串。因此,无需使用 JSON.stringify(array),只需使用 Ids: array - SᴇM
1
@Manoj 我已经点了踩,因为你的解决方案将会返回一个非空对象到控制器,但对于"Ids"列表,它将会得到一个带有实际数组的JSON序列化字符串的项,我认为这不是一个正确的解决方案。 - SᴇM
1
@SeM - 我还没有点赞的原因和你一样。我认为给它一个踩是不公平的——答案至少是正确的方向。但是,我同意:这个答案需要将array作为Ids的值直接传递,而不是序列化它,这会导致它并不完全正确。 - Geoff James
显示剩余2条评论

1
这个答案是为了提供另一种选择(如果有人更喜欢这种解决方案)而准备的:
$.post("Admin/FilteredKeys", { Ids: array, OnlyActive: true });

0

为确保控制器尝试从主体解析模型,您可以添加FromBody属性:

public async Task<IActionResult> FilteredKeys([FromBody] MySearch filter)
{
...
}

另外,您应该在请求中添加一个 application/json 内容类型:

$.ajax({
    type: "POST",
    url: ...,
    data: ...,
    success: ...
    contentType: "application/json"
});

0
 $.ajax({
        type: "POST",
        url: "Admin/FilteredKeys",
        data: { filter: postData},
        success: function(data){
            alert(data.Result);
        },
        dataType: "json",
        traditional: true
    });

通常情况下,如果答案包含代码的意图和解决问题的原因,而不会引入其他问题,那么这些答案会更有帮助。 - Neuron
@LonelyNeuron 谢谢你的建议。 - Emir Cangır

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接