javascript - 将表单与多个文件一起发布到 Web API

标签 javascript c# jquery ajax asp.net-web-api2

我对 Web API 2.0 的工作原理还很陌生,但我已经开始掌握窍门了。我一直遇到的一个问题是如何将表单以及用户上传到我的 Controller 的多个文件一起发布。

我想我主要需要帮助如何使用 JavaScriptjqueryajax 来发布所有正确的值。

这是我的 HTML 的片段:

<form id="CreateAnnouncementForm" class="form-horizontal">
    <input type="hidden" name="announcementTypeID"/>

        <div class="row">
            <div class="col-md-12">
                <div class="form-group">
                    <label class="col-sm-2 control-label">Headline</label>
                    <div class="col-sm-10">
                        <input type="text" class="form-control" name="headline" />
                    </div>
                </div>
                <div class="form-group">
                    <label class="col-sm-2 control-label">More Info</label>
                    <div class="col-sm-10">
                        <textarea class="form-control" name="moreInfo"></textarea>
                    </div>
                </div>
                <div class="form-group">
                    <label class="col-sm-2 control-label">Attachments</label>
                    <div class="col-sm-10">
                        <input type="file" name="Attachments" multiple/>
                    </div>
                </div>
            </div>
        </div>
    </div>
</form>

这是我通常用来将表单发布到 Controller 的 JavaScript/jQuery/Ajax:

onAnnouncementCreate: function () {
    var form = $("#CreateAnnouncementForm");

    var validator = $(form).kendoValidator().data("kendoValidator");

    if (validator.validate()) {
        var options = {
            url: getApiUrl() + "/Announcement",
            dataType: "json",
            type: "POST",
            headers: {
                "Authorization": "Bearer " + getJwtToken(),
                "LocationId": getCurrentLocation()
            },
            data: $(form).serialize(),
            statusCode: {
                200: function () {
                    $("#AnnouncementCreateModal").modal("hide");
                    announcementViewModel.reloadGrids();
                },
                400: function (response) {
                    toastr.options = { "positionClass": "toast-bottom-full-width";
                    toastr.error(response.responseText);
                }
            }
        };

        $.ajax(options);
    }
}

现在,我相信最好是创建一个 ViewModel,其中包含表单中所有值的 ViewModel 并让它包含一个 >IEnumerable 用于用户可以在表单中上传的附件。

我遇到的问题是将附件正确添加到表单中,以便它们正确映射。

我的ViewModel将如下所示:

public class AnnouncementCreateViewModel
{
    public AnnouncementViewModel Announcement { get; set; }
    public IEnumerable<HttpPostedFileBase> Attachments { get; set; }
}

当然,我需要更改表单中的名称以反射(reflect)新模型。

如果有人可以帮助我如何将它们发布到我的 Controller ,我将不胜感激,因为这是我唯一仍在努力解决的问题。

最佳答案

因为这比我想象的要困难。我决定走另一条路。

由于我已经在使用 Kendo UI 框架,因此我现在使用 Kendo Upload 小部件来处理文件的上传。我让它异步地将文件上传到我的 Web API Controller ,然后在提交表单时我有一个单独的操作来处理表单。

当然,我也欢迎其他答案,这些答案可能可以通过在一次调用中发布所有数据来解决此问题,但目前,这样做就可以了。

关于javascript - 将表单与多个文件一起发布到 Web API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39230498/

相关文章:

javascript - 如何防止已取消的商品掉落

javascript - 当我不使用 Promise 的 "then"函数时,是否有任何(负面)副作用?

javascript - 如果 td :nthchild(2) contains 0. 00 值,如何隐藏表中的行?

javascript - 根据是否选中复选框显示隐藏内容

C# 阻止组合框 selectionChanged 事件调用自身

javascript - 防止 JavaScript 中使用迭代的嵌套回调

指示 32 位或 64 位构建的 C# 指令

c# - 查询结果从 Entity Framework 查询中返回与 COLUMN_NAME 相同的值,这是没有意义的

javascript - 让 get() 返回一个 jQuery 对象

javascript - 选择TD中具有特定ID的所有元素