2014-12-05 29 views
0

我想向我的MVC控制器发布三件事:一个图像和两个字符串。发布到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,所有内容都发布为空。这对我来说很成问题,因为我希望能够将图像和两个字符串同时发送到控制器。

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

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

+1

您无法通过ajax上传文件。有一些解决方法,比如通过iframe上传文件,但不幸的是你不能这样做。 – 2014-12-05 18:42:32

+0

我认为你的评论应该足以作为答案,如果你想发布它作为答案。 – alex 2014-12-05 18:45:33

+0

@MelanciaUK'你不能通过ajax *这种方式上传文件'对于混淆 – 2014-12-05 18:53:42

回答

1

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

最好的办法就是使用jquery插件或类似的东西,这些插件会回退诸如通过iframe或其他解决方法上传文件等技术。

+0

我发现jQuery File Upload插件可以在这里工作:https://github.com/blueimp/jQuery-File-Upload/wiki/How-to-submit-additional-form-data – alex 2014-12-08 14:33:27

相关问题