带有id的jQuery ajax上传文件

时间:2016-02-10 15:42:39

标签: jquery ajax asp.net-mvc

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

Controller的动作:

function chkUserInCache(username, password, done) {
  var cacheKey = "partner:" + username;
  if (cache == null) return Promise.resolve(null);

  // Look for the user in the cache.
  return cache.hgetallAsync(cacheKey);
}

jQuery的:

[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);
        }

Razor查看:

$(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);
            }
        });
    });
});

1 个答案:

答案 0 :(得分:1)

问题是因为您需要将FormData直接提供给data的{​​{1}}属性,而不是在对象内,因为它将被编码。如果需要向请求添加数据,请将其附加到$.ajax对象:

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