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

Posted

技术标签:

【中文标题】将字符串数组发布到 .net-core mvc【英文标题】:Posting array of strings to .net-core mvc 【发布时间】:2018-09-20 03:17:55 【问题描述】:

问题:

我正在尝试通过 jquery post 发送一个字符串数组,但它们没有被正确解析,我得到的只是列表中的空值。

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();

我用谷歌搜索,发现传统属性需要设置为 true,但它保持不变,我也尝试了这个 sn-p:

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

这是一个 .net 核心项目,我需要在某处更改其他参数吗?

编辑:

忘了补充一下,我最初的尝试是这样的:

$.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");
        
    );

【问题讨论】:

没有对其进行测试,但我建议在 ajax 中使用 data: filter : postData ,因为我遇到并解决了类似的问题。 我偷偷摸摸的怀疑与您参数化字符串对象的位置有关:$.param(JSON.stringify( Ids: array, OnlyActive: true 。您是否只是尝试将对象本身作为发布数据发布?例如 Ids: array, OnlyActive: true 【参考方案1】:

因为我认为接受的答案是不正确的 - 这里是另一种选择(类似,但与此处的其他答案不同)。首先你需要用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) 
        // ...
    
);

【讨论】:

【参考方案2】:

为什么不这样:

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

【讨论】:

我也是这么想的,Manoj :) 我要说的是,如果你稍微解释一下你的答案,可能会对每个人都有好处。 @Keith - 我知道。也许我不清楚。我的意思是,如果解释了为什么现有代码不起作用,以及这有何不同,这将使所有用户的答案更加完整和易于理解。 它将整个数组字符串化为一个字符串。所以,不需要JSON.stringify(array),只需Ids: array @Manoj 我投了反对票,因为您的解决方案将返回到控制器非空对象,但对于 Ids 列表,它将获得一个项目,其中包含实际数组的 json 序列化字符串,而我没有不认为这是一个正确的解决方案。 @SeM - 同样的原因我还没有投票。我认为投反对票是不公平的——至少答案是正确的。但是,我同意:这个答案需要简单地将array 作为Ids 的值传递,而不是对其进行序列化,这使得它还不完全正确。【参考方案3】:

这个答案是为了替代(如果有人更喜欢这个解决方案):

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

【讨论】:

【参考方案4】:

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

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

...

您还应该在请求中添加 application/json 内容类型:

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

【讨论】:

【参考方案5】:
 $.ajax(
        type: "POST",
        url: "Admin/FilteredKeys",
        data:  filter: postData,
        success: function(data)
            alert(data.Result);
        ,
        dataType: "json",
        traditional: true
    );

【讨论】:

一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。 @LonelyNeuron 谢谢你的建议。

以上是关于将字符串数组发布到 .net-core mvc的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有表单的情况下将字符串数组发布到 ASP.NET MVC 控制器?

在 Spring MVC 中使用 curl 将字符串值数组作为请求正文发布

如何在 net-core 2.0 中手动解析 JSON 字符串

将音频(字节数组)发布到 MVC.NET Web Api

将 JSON 字符串发送到 MVC 控制器失败

如何使用 Ajax 调用 MVC4 传递两个字符串数组