发布到MVC Controller的文件为空

时间:2014-12-05 18:40:15

标签: ajax asp.net-mvc asp.net-mvc-5

我想向我的MVC控制器发布三个内容:一个图像和两个字符串。

查看上,我找到了一个使用enctype="multipart/form-data"的表单,该表单会在选择图像文件后自动提交表单。这是此表单的提交处理程序:

    $("#PhotoUploadForm").on("submit", function (event) {
        event.preventDefault();

        var ImageData = $("#PhotoUploadFileInput").val();
        var GuestNumber = $("#GuestID").val();
        var TCSA_ID = vm.GetSelectedTreatmentAreaTCSA_ID(vm.Photographs.SelectedTreatmentArea());

        var dto = {
            ImageData: ImageData,
            GuestNumber: GuestNumber,
            TCSA_ID: TCSA_ID
        }

        $.ajax({
            url: 'SaveImage',
            type: "POST",
            contentType: "multipart/form-data",
            data: ko.toJSON(dto),
            success: function (data) {
                console.log(submitted);
            }
        });
    });

我的模型

中定义了dto个对象
public class PhotoUploadDTO
{
    public HttpPostedFileBase ImageData { get; set; }
    public string GuestNumber { get; set; }
    public string TCSA_ID { get; set; }
}

在我的控制器中,我有一个以dto为参数的操作:

   public ActionResult SaveImage(PhotoUploadDTO dto)
   {
     //etc.
   }

当我尝试发布dto时,所有内容都会发布为null。这对我来说有问题,因为我希望能够同时将图像和两个字符串发布到控制器。

我怀疑问题出在var ImageData(在我的视图中设置为<input type="file" id="PhotoUploadFileInput">的值),并且它被发布为C:/fakepath/etc.但不是实际的图像文件。这令人沮丧,因为我知道如果我有一个只是发布图片的表单,它甚至不会成为一个问题,但我需要才能使用它提交处理程序,我不知道如何将实际的图像数据带入其中。

为什么数据null何时到达MVC控制器,如何在仍然能够使用提交处理程序的同时发布这三个项目?

1 个答案:

答案 0 :(得分:1)

通过ajax上传文件是一件棘手的事情。一些最现代的Web浏览器通过使用File API来处理这个问题,{{3}}确实可以通过ajax上传文件。但是,使用此解决方案不适用于旧浏览器上的人。

您最好的选择是使用jquery插件或类似的东西,这些插件将依赖于通过iframe或其他解决方法上传文件等技术。