【问题标题】:jQuery ajax upload file with id带有id的jQuery ajax上传文件
【发布时间】:2016-02-10 15:42:38
【问题描述】:

我正在使用 ASP.NET MVC5。我的目标是使用 jQuery ajax 上传文件。成功后,返回表格中已上传文件的部分视图。当我单步执行 jQuery 代码时,id 和 files 是正确的,但是当我单步执行 Action 时,这两个参数都是空的。这是我的代码:

控制器的动作:

[HttpPost]
        public ActionResult AddAttachments(string id, IEnumerable< HttpPostedFileBase> files)
        {            
            if (files != null)
            {
                //save files
            }
            var cardKey = db.CardKeys.Single(s => s.CardKeyID == Convert.ToInt32(id));
            var attachments = cardKey.Request.Attachments;
            return PartialView("_AttachmentsTable",attachments);
        }

jQuery:

$(function () {
    var table = $("#attachmentTable").DataTable();
    var path = MySettings.addAttachmentURL;
    $("#btnAddAttachment").click(function (event) {
        event.preventDefault();

        var formData = new FormData();
        var cardKeyID = $("#CardKeyID").val();

        var formData = $.each($("#files")[0].files, function (i, file) {
            formData.append('file-' + i, file);
        });
        console.log("formData = " + formData);
        $.ajax({
            type: "POST",
            url: path,
            contentType: false,
            processData:false,
            cache:false,
            data: {id:cardKeyID,files: formData },
            success: function (partialResult) {
                $("#tableData").html(partialResult);
                table = $("#attachmentTable").DataTable();
            },
            error: function (jqXHR, textStatus, errorThrown) {
                $("#message").html(JSON.stringify(jqXHR).toString());
                alert("AJAX error: " + textStatus + ' : ' + errorThrown);
            }
        });
    });
});

剃刀视图:

<fieldset>
            <legend>Add Attachments</legend>
        <div class="row">
            <div class="col-md-4">
                <div class="form-group">
                    @Html.Label("File Upload", new { @class = "control-label col-md-6" })
                    <div class="col-md-6">
                        <input type="file" id="files" name="files" multiple/><br />
                        <input type="submit" id="btnAddAttachment" value="Add Attachment"/>

                    </div>
                </div>
            </div>
            <div class="col-md-4">
                <div class="form-group">
                    @Html.Label("File Description", new { @class = "control-label col-md-6" })
                    <div class="col-md-6">
                        @Html.TextBox("FileDescription")
                    </div>
                </div>
            </div>
            <div class="col-md-4">
                <div class="form-group">
                    @Html.Label("Comment", new { @class = "control-label col-md-6" })
                    <div class="col-md-6">
                        @Html.TextBox("Comment")
                    </div>
                </div>
            </div>
        </div>
        <div id="tableData">
            @Html.Partial("_AttachmentsTable",Model.Request.Attachments)
        </div>
        </fieldset>

【问题讨论】:

  • 不能使用ModelBinder来获取上传的文件,需要使用Request.Files。有关详细信息,请参阅我标记为重复的问题。
  • 我在调试模式下检查了Request对象并且Files属性是空的。
  • 在这种情况下,请参阅工作代码的重复问题中的工作 jQuery 示例。
  • 我试过那些jQuery代码,jQuery数据没问题,但是当将ajax数据传递给MVC动作时,参数都是空的。那是我的问题。
  • 好的,我标记的副本确实有工作代码,但不能直接解决您的问题。我为你添加了答案。

标签: jquery ajax asp.net-mvc


【解决方案1】:

问题是因为您需要将FormData 直接提供给$.ajaxdata 属性,而不是在对象中,因为它将被编码。如果您需要在请求中添加数据,请将其附加到FormData 对象:

var formData = new FormData();
var cardKeyID = $("#CardKeyID").val();
var formData = $.each($("#files")[0].files, function (i, file) {
    formData.append('file-' + i, file);
});
formData.append('id', cardKeyID);

$.ajax({
    data: formData,
    // other properties here...
});

然后在控制器中你需要直接从Request检索数据:

[HttpPost]
public ActionResult AddAttachments()
{    
    var id = Request.Params["id"];
    foreach(var file in Request.Files) {
        //save files
    }

    var cardKey = db.CardKeys.Single(s => s.CardKeyID == Convert.ToInt32(id));
    var attachments = cardKey.Request.Attachments;
    return PartialView("_AttachmentsTable",attachments);
}

请注意,如果 form 元素包含您要在请求中发送的所有字段,您可以避免使用 $.each 并且必须直接附加并简单地使用:

var formData = new FormData($('form')[0]);

【讨论】:

  • 嗨,罗里,var formData = new FormData($('form')[0]);确实有效。但是当我使用示例代码 formData.append('id', cardKeyID); javascript 抱怨:0x800a01b6 - JavaScript 运行时错误:对象不支持属性或方法“附加”。这很奇怪。
  • 这很奇怪。你用的是哪个浏览器?
猜你喜欢
  • 2011-04-24
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
相关资源
最近更新 更多