javascript - MVC 4 Ajax异步文件上传始终将空值传递给 Controller

标签 javascript jquery ajax asp.net-mvc parameter-passing

我在尝试从 ajax 异步上传文件到我的 Controller 时遇到问题。我有 3 个变量要传递(PictureId、PictureName 和 PictureFile)。问题出在我的“PictureFile”变量上,该变量应该保存上传的文件本身,但它总是将 null 值传递给 Controller ​​。

这是我的 View 模型

public class PictureUpload
{
    public int PictureId { get; set; }
    public string PictureName { get; set; }
    public HttpPostedFileBase PictureFile { get; set; }
}

这是我的 Controller

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

在我的 Controller 参数中。 “PictureId”“PictureName”持有正确的值,但“PictureFile”始终为空。因此,这意味着当系统将参数从 ajax 传递到 Controller 时,出现了一些问题。不知何故,系统对待"file"类型的方式与其他类型不同。您能否帮助我将文件成功传递到 Controller 并告诉我这种方法有什么问题?

最佳答案

正如评论中正确提到的,使用 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) {                  
        }
    });

关于javascript - MVC 4 Ajax异步文件上传始终将空值传递给 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30908028/

相关文章:

javascript - 如何在 React 中停止进一步处理事件

javascript - 我想将 jquery.post() 中的 JSON 对象输入到简单的 JS 图表(条形图)?

Jquery 可拖动占位符

javascript - 如何检测鼠标光标是否超出元素?

ajax - pjax(基于ajax的页面加载)和用户滚动

php - 认证前在注册页面上传 $_FILES(IMAGE)

javascript - javascript 重置中的简单数字键盘

javascript - get Kendo Chart() 在 javascript 中显示为未定义

javascript - 如何使用 JS 将类添加到所选单选按钮的父级 <li>

php - 搜索结果将显示在响应式弹出窗口中