【问题标题】:Upload file and Json data in the same POST request using vanilla javascript ajax [ASP.NET Core]使用 vanilla javascript ajax [ASP.NET Core] 在同一个 POST 请求中上传文件和 Json 数据
【发布时间】:2020-03-26 12:34:55
【问题描述】:

我正在尝试使用 vanilla js Ajax 发送一个 POST 请求,我想在其中上传一个文件和一些 json 数据。

但我收到“内部服务器错误:500”且控制器参数为空值。

请帮助我。

我的 javascript 代码

var btnSubmit = document.getElementById("btn-submit");
        btnSubmit.addEventListener("click", function () {

            var formData = new FormData();
            var fileElement = document.getElementById("WaterTankBlueprint");
            formData.append("file", fileElement.files[0]);

            var aquaFarm = {
                Name: document.getElementById("Name").value,
                Region: document.getElementById("Region").value,
                CEO: document.getElementById("CEO").value 
            }

            var aquaFarmViewModel = {
                AquaFarm: aquaFarm,
                WaterTankBlueprint: formData 
            };

            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function () {
                if (xhr.readyState === xhr.DONE) {
                    if (xhr.status === 200) {

                    }
                }
            };

            xhr.open("POST", "/workplace/aqua-farm/add", true);
            xhr.setRequestHeader("Content-Type", "application/json");
            xhr.send(JSON.stringify(aquaFarmViewModel));

        });

我的视图模型

public class AquaFarmViewModel
{
    public AquaFarm AquaFarm { get; set; }

    public IFormFile WaterTankBlueprint { get; set; }

}

我的控制器

 [HttpPost]
 [Route("workplace/aqua-farm/add")]
 public IActionResult AddAquaFarm([FromBody] AquaFarmViewModel viewModel)
 {
      // ...... code
      return RedirectToAction("AquaFarm");

 }

【问题讨论】:

    标签: javascript asp.net-core


    【解决方案1】:

    这是一个如下所示的工作演示:

    型号:

    public class AquaFarmViewModel
    {
        public AquaFarm AquaFarm { get; set; }
        public IFormFile WaterTankBlueprint { get; set; }
    }
    
    public class AquaFarm
    {
        public string Name { get; set; }
        public string Region { get; set; }
        public string CEO { get; set; }
    }
    

    查看:

    <form enctype="multipart/form-data">
        <div>File:<input type="file" id="WaterTankBlueprint" /></div>
        <div>Name:<input id="Name" /></div>
        <div>Region:<input id="Region" /></div>
        <div>CEO:<input id="CEO" /></div>
        <div><input type="button" id="btn-submit" value="Submit" /></div>
    </form>
    @section Scripts
    {
    <script>
        var btnSubmit = document.getElementById("btn-submit");
            btnSubmit.addEventListener("click", function () {
    
                var formData = new FormData();
                var fileElement = document.getElementById("WaterTankBlueprint");
                formData.append("WaterTankBlueprint", fileElement.files[0]);
    
                formData.append("AquaFarm.Name", document.getElementById("Name").value);
                formData.append("AquaFarm.Region", document.getElementById("Region").value);
                formData.append("AquaFarm.CEO", document.getElementById("CEO").value);
    
                var xhr = new XMLHttpRequest();
                xhr.onreadystatechange = function () {
                    if (xhr.readyState === xhr.DONE) {
                        if (xhr.status === 200) {
    
                        }
                    }
                };
    
                xhr.open("POST", "/workplace/aqua-farm/add", true);
                xhr.send(formData);
    
            });
    </script>
    }
    

    控制器:

    [HttpPost]
    [Route("workplace/aqua-farm/add")]
    public IActionResult AddAquaFarm(AquaFarmViewModel viewModel)
    {
        // ...... code
        return RedirectToAction("Index");
    }
    

    结果:

    【讨论】:

    • 我可以在formdata中放一个List吗?
    • 当然可以。请参考here。如果我的回答对你有帮助,你能接受吗?谢谢。
    • 如果我的回答对您有帮助,请您在下面标记:meta.stackexchange.com/questions/5234/…仍有问题,请跟进让我知道。谢谢。
    猜你喜欢
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 2017-02-28
    • 1970-01-01
    相关资源
    最近更新 更多