2015-09-11 36 views
0

我正在上传文件,为此我在jQuery ajax中使用FormData对象并将它传递给ASP.NET MVC WEB API,它工作正常,我能够获取文件在服务器端,但我想通过相同的请求传递一些额外的细节。如何将FormData中的其他数据发送到web api

我可以在标题中添加额外的数据,并且我可以在服务器端从头文件中获取数据,但是我也会为移动应用使用相同的API。所以如果我可以将数据作为函数的参数传递,那么它会很好。

那么如何在formData对象中传递额外的数据以及如何在服务器端获取它呢?

我的代码,

function uploadEvaluationFile() { 

    var files = $("#file_UploadFile1").get(0).files; 
    if (files.length > 0) { 
     if (window.FormData !== undefined) { 
      var data = new FormData(); 
      for (var x = 0; x < files.length; x++) { 
       data.append("file1" + x, files[x]); 
      } 


data.append("UserId", 5); 
      data.append("ArtCategory", 5); 
      data.append("Title", "Title1"); 
      data.append("Description", "Desc 1"); 

      $.ajax({ 
       type: "POST", 
       url: '/Home/saveEvaluationFile', 
       contentType: false, 
       processData: false, 
       data: data, 
       async: false, 
       beforeSend: function (xhr) { 
        xhr.setRequestHeader('identifier', 111); 
        xhr.setRequestHeader('oldFileName', 222); 
       }, 
       dataType: "json", 
       success: function (result) { 
        console.log(result); 
       }, 
       error: function (err) { 
        console.log(err); 
       } 
      }); 
     } else { 
      alert("This browser doesn't support HTML5 file uploads!"); 
     } 
    } 
} 

网络API代码,

[HttpPost] 
     public async Task<JsonResult> saveEvaluationFile(EvaluationFileDetails FileData) 
     { 
      IEnumerable<string> headerValues = Request.Headers.GetValues("oldFileName"); 
      var oldFileName = headerValues.FirstOrDefault(); 
      IEnumerable<string> headerValues1 = Request.Headers.GetValues("identifier"); 
      var newFileName = headerValues1.FirstOrDefault(); 

      try 
      { 
       foreach (string file in Request.Files) 
       { 
        HttpPostedFileBase hpf = Request.Files[file] as HttpPostedFileBase; 
       } 
      } 
      catch (Exception) 
      { 
       return Json("Upload failed"); 
      } 

      return Json("File uploaded successfully"); 
     } 

我的班级,

public class EvaluationFileDetails 
    { 
     public HttpPostedFileBase file1 { get; set; } 
     public int UserId { get; set; } 
     public int ArtCategory { get; set; } 
     public string Title { get; set; } 
     public string Description { get; set; } 

    } 
+0

可能重复[如何追加整套模型在MVC以FORMDATA和获得它](http://stackoverflow.com/questions/29293637/how-to-append-whole-set-of-model-to-formdata-and-obtain-it-in-mvc) –

+0

我不能通过HttpPostedFileBase,因为我我没有使用表单标签。在对象中,我也可以添加文件。 ? –

+1

不确定你的意思。你可以使用FormData传递任何你想要的东西。但是如果你只是为你的方法添加参数(例如模型),你会发现这很容易,所以你没有访问值的形式请求' –

回答

2

您可以使用同样喜欢

data.append("file1" + x, files[x]); 

例如:

formdata.append('Key', 'Value'); 

获取数据

[HttpPost] 
public async Task<JsonResult> saveEvaluationFile(FileModel model) 
{ 
    foreach (string image in model.images) 
    { 
    HttpPostedFileBase hpf = model.images[image ] as HttpPostedFileBase; 
    // nesasary save part 
    } 

文件添加到模型

public class FileModel 
{ 
... 
public HttpPostedFileBase File1 { get; set; }//one file 
public IEnumerable<HttpPostedFileBase> images {get;set;}//file collection 
} 
+0

,我也可以添加文件。 ? –

+0

是的,你可以。请参阅修改后的答案 – Iceburg

+0

请检查我的更新问题,我添加了类,并且我正在获取除文件外的所有数据。file1属性在服务器端为空 –

相关问题