代码之家  ›  专栏  ›  技术社区  ›  ThunD3eR

正在将字符串数组过帐到。净核心mvc

  •  3
  • ThunD3eR  · 技术社区  · 8 年前

    问题:

    我试图通过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核心项目是否需要在某处更改其他参数?

    编辑:

    forgott补充道,我最初的尝试是这样的:

    $.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");
            }
        });
    }
    
    5 回复  |  直到 8 年前
        1
  •  3
  •   Evk    8 年前

    因为我认为公认的答案是不正确的——这里是备选答案(类似,但与这里的其他答案不同)。首先,你需要用 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
  •  1
  •   SᴇM    8 年前

    为什么不仅仅是这样:

      $.post("Admin/FilteredKeys",{ Ids: JSON.stringify(array), OnlyActive: true });
    
        3
  •  1
  •   SᴇM    8 年前

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

    $.post("Admin/FilteredKeys", { Ids: array, OnlyActive: true });
    
        4
  •  0
  •   J.Loscos    8 年前

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

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

    您还应该向请求中添加应用程序/json内容类型:

    $.ajax({
        type: "POST",
        url: ...,
        data: ...,
        success: ...
        contentType: "application/json"
    });
    
        5
  •  0
  •   Emir Cangır    8 年前
     $.ajax({
            type: "POST",
            url: "Admin/FilteredKeys",
            data: { filter: postData},
            success: function(data){
                alert(data.Result);
            },
            dataType: "json",
            traditional: true
        });