【问题标题】:Cannot get Dropzone.js to send additional data无法让 Dropzone.js 发送附加数据
【发布时间】:2020-08-17 06:01:07
【问题描述】:

我将 Dropzone.js 与 .net core 3.1 一起使用。我可以让它调用我的控制器操作,但我不能让它随请求发送任何额外的数据。

这是我的表格:

<form action="/api/photos/"
          class="dropzone needsclick dz-clickable"
          id="image-upload"
          method="post">
        <input type="hidden" name="eventId" value="1"/>
        <div class="dz-message needsclick">
            <span class="note needsclick">
                Drop files here or click to upload.
            </span>
        </div>
    </form>

这是我的 Javascript:

<script>
            Dropzone.options.imageUpload = {
                dictDefaultMessage: "Drop files here or Click to Upload",
                addRemoveLinks: true, // Allows for cancellation of file upload and remove thumbnail
                init: function () {
                myDropzone = this;
                    myDropzone.on("sending", function (file, xhr, data) {
                data.append("message", "hello world");
                        console.log(data);
                    });
                    myDropzone.on("success", function (file, response) {
                console.log("Success");
                        myDropzone.removeFile(file);
                    });
                }
            };
    </script>

这是我的控制器端点

public async Task<IActionResult> PostPhoto(List<IFormFile> file)
        {
            ..code removed..
        }

所以你可以看到我在表单中有一个隐藏字段,它应该与请求一起发送数据,我也尝试通过 JS 向表单数据附加一个值,但要么它没有发送或者我找不到。我查看了开发工具的网络面板,可以看到正在发送的图像,但没有别的。或者如果正在发送它,我将如何在控制器中找到它?我在这上面花了很长时间,这有点烦人,请帮忙!

【问题讨论】:

  • 看起来您的控制器只接受文件,并且您尝试使用 enctype="multipart/form-data" 发送 JSON 数据,您必须使用 enctype="application/json" 发送常规 JSON数据。
  • 我从表单中删除了 enctype,但仍然没有运气 - 根据 dropzone 网站上的“提示”部分,“Dropzone 将提交您在 dropzone 表单中的所有隐藏字段。所以这是提交附加数据的简单方法。您也可以使用 params 选项。"。这些方法都不适合我。

标签: javascript asp.net-core dropzone.js razor-pages


【解决方案1】:

您可以在表单操作中将 eventId 添加到 url 参数,例如 &lt;form action="/api/photos/1"

然后更新你的控制器动作:

    [HttpPost]
    [Route("api/photos/{eventId:int}")]
    public async Task<IActionResult> PostPhoto([FromRoute] int eventId, List<IFormFile> file)
    {
        ..code removed..
    }

使用sending 事件的另一种解决方案,就像你一样。但是您需要将参数添加到您的控制器操作中。你在js中追加message,所以你的代码会是这样的:

    public async Task<IActionResult> PostPhoto([FromForm]string message, List<IFormFile> file)
    {
        ..code removed..
    }

【讨论】:

  • 谢谢 - 我明白了。第二种方法有效,通过使用 JS 中的发送事件。另一种有效的方法 - 正如文档所说 - 是在表单中包含隐藏字段,关键是修改控制器签名以也按照第二种方法接受值。
猜你喜欢
  • 2014-07-20
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2019-08-02
  • 2016-03-11
  • 2014-10-20
相关资源
最近更新 更多