json 正在将对象列表发送到ASP.NET Core Web API控制器

qq24tv8q  于 2022-12-24  发布在  .NET
关注(0)|答案(2)|浏览(173)

从ASP .NETMVC到. NETCore,事情似乎变得更加复杂,因为我不能再使用 AJAX 轻松地将对象列表发送到控制器。请指出我做错了什么。
在我的控制器中,我有这个方法:

[HttpPost("EditMultipleResults")]
[Consumes("application/x-www-form-urlencoded")]
public bool EditMultipleResults([FromForm] List<Result>, [FromForm] string comment)
{
    // do something...
    return true;
}

此处定义结果

public class Result
{
    [Key]
    public long taskcd { get; set; } 
    public long Runno { get; set; }
    public string Workorder {get; set;}       
}

在我的JS AJAX 中,我有:

var results = [
{taskcd: 123,
 Runno: 187776876,
 Workorder: 'VA1234567'
},
{taskcd: 642,
 Runno: 187776877,
 Workorder: 'VA1234569'
},
{taskcd: 766,
 Runno: 187776876,
 Workorder: 'VA1234564'
}
];

 var posteddata = {
            results: results,
            comment: 'test comment'
        };

// call the controller
$.ajax({
            type: 'POST',         
            data: posteddata,            
            traditional: true,
            contentType: 'application/x-www-form-urlencoded; charset=utf-8',          
            url:  'api/ResultsEditor/EditMultipleResults',
            success: function () {
                deferred.resolve();
            },
            error: deferred.reject
        });
        return deferred.promise();

我的问题是结果列表和原因在控制器中为空。在.NET核心5中传递对象列表到控制器有什么技巧吗?谢谢!
另一个问题:有没有办法在开发工具中看到传递给控制器的数据?

kr98yfug

kr98yfug1#

您不能多次使用[FromForm](以及[FromBody]),您的操作输入参数应该与ajax中的相同,因此您必须创建一个类

public class PostedData
    {
        public List<ResultItem> Results { get; set; }
        public string Comment { get; set; }
    };

和行动

public bool EditMultipleResults(PostedData data)
{
    // do something...
    return true;
}

并且您不需要使用[Consumes("application/x-www-form-urlencoded")]、[FromForm]和contentType:'应用程序/x-www-格式-网址编码; charset = utf-8 ',因为默认情况下它们都已经是。

y3bcpkx1

y3bcpkx12#

因为你是手工创建表单数据作为一个json对象,而不是发布一个html表单,所以你也需要手工将数据编码为x-www-form-urlencoded。
这个post有一些很好的建议。确保不仅仅阅读被接受的答案。

相关问题