Javascript 是否可以将FormData对象中的文件列表和整个json对象发送到ASP.NET核心MVC控制器
正如标题所说,如何使用包含嵌套对象和文件列表的json对象向mvc控制器发送formdata对象。 我已经尝试将对象字符串化为json对象,但控制器无法读取属性,它读取文件列表时没有问题 以下是控制器方法: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 } 如果可能的
[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");
}