如何在MVC 5中的单个Ajax POST请求中发送ViewModel和文件?

我有一个ASP.NET MVC 5应用程序。 我正在尝试使用Model数据发送POST请求,还包括用户选择的文件。 这是我的ViewModel(为简洁起见而简化):

public class Model { public string Text { get; set; } public long Id { get; set; } } 

这是控制器动作:

 [HttpPost] public ActionResult UploadFile(long userId, Model model) { foreach (string file in Request.Files) { // process files } return View("Index"); } 

Html输入元素:

 

和JavaScript代码:

 $('#txtUploadFile').on('change', function (e) { var data = new FormData(); for (var x = 0; x < files.length; x++) { data.append("file" + x, files[x]); } data.append("userId", 1); data.append("model", JSON.stringify({ Text: 'test text', Id: 3 })); $.ajax({ type: "POST", url: '/Home/UploadFile', contentType: false, processData: false, data: data, success: function (result) { }, error: function (xhr, status, p3, p4) { } }); }); 

问题是当请求到达控制器操作时,我有文件和’userId’填充,但’model’参数始终为null。 填充FormData对象时我做错了什么?

这是我使用MVC5和IE11 / chrome测试的内容

视图

  

调节器

 public class HomeController : Controller { [HttpGet] public ActionResult Index() { return View(); } [HttpPost] public ActionResult Index(HttpPostedFileBase file1, string name1, string name2) { var result = new List(); if (file1 != null) result.Add(string.Format("{0}: {1} bytes", file1.FileName, file1.ContentLength)); else result.Add("No file"); result.Add(string.Format("name1: {0}", name1)); result.Add(string.Format("name2: {0}", name2)); return Content(string.Join(" - ", result.ToArray())); } } 

感谢Silver89的回答