我正在使用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);
}
});
});
});
答案 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