MVC 4 Ajax 异步文件上传总是将空值传递给控制器
MVC 4 Ajax Asynchronous File Upload Always Passing Null Value To Controller
我在尝试将文件从 ajax 异步上传到我的控制器时遇到问题。我有 3 个变量要传递 (PictureId、PictureName 和 PictureFile)。问题出在我的 "PictureFile" 变量上,它应该保存上传的文件本身,但 它总是将 null 值传递给控制器。
这是我的视图模型
public class PictureUpload
{
public int PictureId { get; set; }
public string PictureName { get; set; }
public HttpPostedFileBase PictureFile { get; set; }
}
这是我的控制器
public JsonResult EditPicture(PictureUpload picture)
{
//do something here
}
这是我的表格
<div class="thumbnail" id="uploadForm">
<form name="uploadForm" enctype="multipart/form-data">
<input type="text" name="fileId" hidden="hidden" />
<input type="file" name="file" style="max-width: 100%" />
<input type="button" name="cancel" value="cancel" />
<span>
<input type="button" name="upload" value="upload" />
</span>
</form>
</div>
这是我的脚本
$("input[name=upload]").click(function () {
var $pictureId = $("input[name=fileId]").val();
var $pictureFile = $("input[name=file]").get(0).files[0];
$.ajax({
type: 'POST',
url: '@Url.Action("EditPicture", "Restaurant")',
contentType: "application/json",
dataType: 'json',
data: JSON.stringify({ PictureId: $pictureId, PictureName: $pictureFile.name, PictureFile: $pictureFile }),
});
在我的控制器参数中。 "PictureId" 和 "PictureName" 保持正确的值,但 "PictureFile" 始终为空。因此,这意味着当系统将参数从 ajax 传递给控制器时,事情发生了变化。系统以某种方式对待 "file" 类型与其他类型不同。你能帮我把文件成功传递给控制器,并告诉我这种方法有什么问题吗?
您无法使用 AJAX 上传文件。实现此目的的一种方法是使用隐藏的 iframe,它将模拟 AJAX 调用并执行实际的文件上传或使用 Flash。
正如评论中正确提到的那样,使用 FormData。下面是一个代码片段:
var fd = new FormData();
fd.append('file', fileObject);
fd.append('PictureId', pictureId);
fd.append('PictureName', pictureName);
$.ajax({
url: '/Restaurant/EditPicture',
async: true,
type: 'POST',
data: fd,
processData: false,
contentType: false,
success: function (response) {
}
});
我在尝试将文件从 ajax 异步上传到我的控制器时遇到问题。我有 3 个变量要传递 (PictureId、PictureName 和 PictureFile)。问题出在我的 "PictureFile" 变量上,它应该保存上传的文件本身,但 它总是将 null 值传递给控制器。
这是我的视图模型
public class PictureUpload
{
public int PictureId { get; set; }
public string PictureName { get; set; }
public HttpPostedFileBase PictureFile { get; set; }
}
这是我的控制器
public JsonResult EditPicture(PictureUpload picture)
{
//do something here
}
这是我的表格
<div class="thumbnail" id="uploadForm">
<form name="uploadForm" enctype="multipart/form-data">
<input type="text" name="fileId" hidden="hidden" />
<input type="file" name="file" style="max-width: 100%" />
<input type="button" name="cancel" value="cancel" />
<span>
<input type="button" name="upload" value="upload" />
</span>
</form>
</div>
这是我的脚本
$("input[name=upload]").click(function () {
var $pictureId = $("input[name=fileId]").val();
var $pictureFile = $("input[name=file]").get(0).files[0];
$.ajax({
type: 'POST',
url: '@Url.Action("EditPicture", "Restaurant")',
contentType: "application/json",
dataType: 'json',
data: JSON.stringify({ PictureId: $pictureId, PictureName: $pictureFile.name, PictureFile: $pictureFile }),
});
在我的控制器参数中。 "PictureId" 和 "PictureName" 保持正确的值,但 "PictureFile" 始终为空。因此,这意味着当系统将参数从 ajax 传递给控制器时,事情发生了变化。系统以某种方式对待 "file" 类型与其他类型不同。你能帮我把文件成功传递给控制器,并告诉我这种方法有什么问题吗?
您无法使用 AJAX 上传文件。实现此目的的一种方法是使用隐藏的 iframe,它将模拟 AJAX 调用并执行实际的文件上传或使用 Flash。
正如评论中正确提到的那样,使用 FormData。下面是一个代码片段:
var fd = new FormData();
fd.append('file', fileObject);
fd.append('PictureId', pictureId);
fd.append('PictureName', pictureName);
$.ajax({
url: '/Restaurant/EditPicture',
async: true,
type: 'POST',
data: fd,
processData: false,
contentType: false,
success: function (response) {
}
});