Javascript 是否可以将FormData对象中的文件列表和整个json对象发送到ASP.NET核心MVC控制器

Javascript 是否可以将FormData对象中的文件列表和整个json对象发送到ASP.NET核心MVC控制器,javascript,jquery,ajax,asp.net-core,form-data,Javascript,Jquery,Ajax,Asp.net Core,Form Data,正如标题所说,如何使用包含嵌套对象和文件列表的json对象向mvc控制器发送formdata对象。 我已经尝试将对象字符串化为json对象,但控制器无法读取属性,它读取文件列表时没有问题 以下是控制器方法: [HttpPost] public IActionResult CreateTask(Task task, IEnumerable<IFormFile> files) { //some code } 如果可能的

正如标题所说,如何使用包含嵌套对象和文件列表的json对象向mvc控制器发送formdata对象。 我已经尝试将对象字符串化为json对象,但控制器无法读取属性,它读取文件列表时没有问题

以下是控制器方法:

[HttpPost]
     public IActionResult CreateTask(Task task, IEnumerable<IFormFile> files)
        {

            //some code
        }

如果可能的话,我需要控制器方法同时读取任务和文件列表。

唯一的方法是将作为任务发送的JSON绑定到字符串服务器端。然后,您必须手动将其反序列化为对象。如果不明显,这也意味着您将无法对该JSON对象的任何成员进行任何验证。就ASP.NET核心和modelbinder而言,它只是一个字符串

也就是说,我认为这里的问题是您需要上传文件,并且认为这需要作为多部分/表单数据发布。实际上,您可以以JSON的形式发布,但仍然可以包含文件上传。不过,这需要两个变化:

必须将文件上载绑定到字节[]s,而不是服务器端的文件

在客户端,必须将它们添加到要发布的JSON对象中,作为Base64编码字符串或uint8数组

第一部分比较直截了当。modelbinder调用的JSON反序列化程序将自动将Base64编码字符串转换为字节数组,当然JS unint8数组本质上只是一个字节数组

第二部分可能需要更多的讨论。您需要使用文件API读取上载文件数据,然后将其转换为Base64编码字符串或uint8数组:

Base64

字节数组


您可以尝试将对象转换为表单数据,如下所示:

看法

        <script type="text/javascript">
            $(document).ready(function () {
                $("input").change(function () {
                    var formData = new FormData();
                    var files = $("#files")[0].files;

                    var obj = {
                        id: 1,
                        name: "jack"
                    };
                    for (var key in obj) {
                        formData.append(key, obj[key]);
                    }
                    for (var key in files) {
                        formData.append("files", files[key]);
                    }


                    $.ajax({
                        type: "POST",
                        url: "/api/values/CreateTask",
                        processData: false,
                        contentType: false,
                        data: formData,
                        success: function (data) {

                        },
                        error: function (data) {

                        }
                    })

                });
            });
        </script>
控制器

        [HttpPost]
        public IActionResult CreateTask([FromForm]Task task, [FromForm]IEnumerable<IFormFile> files)
        {
            return Ok("Success");
        }
var reader = new FileReader();
reader.onload = function(e) {
    let bytes = Array.from(new Uint8Array(reader.result));
    myJsonObject.files.push(bytes);
}
reader.readAsArrayBuffer(file);
        <script type="text/javascript">
            $(document).ready(function () {
                $("input").change(function () {
                    var formData = new FormData();
                    var files = $("#files")[0].files;

                    var obj = {
                        id: 1,
                        name: "jack"
                    };
                    for (var key in obj) {
                        formData.append(key, obj[key]);
                    }
                    for (var key in files) {
                        formData.append("files", files[key]);
                    }


                    $.ajax({
                        type: "POST",
                        url: "/api/values/CreateTask",
                        processData: false,
                        contentType: false,
                        data: formData,
                        success: function (data) {

                        },
                        error: function (data) {

                        }
                    })

                });
            });
        </script>
        [HttpPost]
        public IActionResult CreateTask([FromForm]Task task, [FromForm]IEnumerable<IFormFile> files)
        {
            return Ok("Success");
        }