How do I get files AND form values from an ASP.NET MVC 4 website?

asp.net-mvc, asp.net-mvc-4, c#, forms, http

Solution

I think that this should do it

[HttpPost]
public ActionResult Index(IEnumerable<HttpPostedFileBase> files, FormCollection form)
{
  //handle the files

  //handle the returned form values in the form collection
}

You should be able to pass in 2 parameters in the [HttpPost] action. you can also pass in the HTML name.

Edit: I also had problems with forms in ASP.net. I suggest looking into this blog post by Scott Allen. http://odetocode.com/blogs/scott/archive/2009/04/27/6-tips-for-asp-net-mvc-model-binding.aspx

Problem

I have an ASP.NET MVC Website that has a dropdown list that is being created using this in the view... ``` @Html.DropDownList("Programs") ``` Programs is populated from a Business Object collection and stuffed into the ViewBag in the index action on the Home Controller... ``` \\get items... ViewBag.Programs = items; ``` The view also has potentially three files I am getting like this in the same view... ``` <input type="file" name="files" id="txtUploadPlayer" size="40" /> <input type="file" name="files" id="txtUploadCoaches" size="40" /> <input type="file" name="files" id="txtUploadVolunteers" size="40" /> ``` All of the aforementioned controls are contained in a Form that is created in the view using... ``` @using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })) { <!-- file and other input types --> <input type="submit" name="btnSubmit" value="Import Data" /> } ``` My problems is that I cannot find a way to process all of the files AND reference the form fields. Specifically, I need to know what Program the user selected from the dropdown. I can process the files using this code with no problem... ``` [HttpPost] public ActionResult Index(IEnumerable<HttpPostedFileBase> files) //public ActionResult Index(FormCollection form) { _tmpFilePath = Server.MapPath("~/App_Data/uploads"); if (files == null) return RedirectToAction("Index"); foreach (var file in files) { if (file != null && file.ContentLength > 0) { var fileName = Path.GetFileName(file.FileName); var path = Path.Combine(_tmpFilePath, fileName); if (System.IO.File.Exists(path)) System.IO.File.Delete(path); _file = file; file.SaveAs(path); break; //just use the first file that was not null. } } //SelectedProgramId = 0; //DoImport(); return RedirectToAction("Index"); } ``` But I cannot figure how to ALSO get access to the POST form values especially the Programs dropdown selected value (and for the record there is also a checkbox that I cannot read the value from.) Fiddler shows me that the Response has the file references AND the selected program but I cannot figure out how to get them out of the POST using ASP.NET MVC. I know this question is pretty basic but I am stilling learning the whole web/http thing not just MVC. EDIT Thanks for your answers. I had the thought that the answer might lie in passing in both the files and the form values into the POST. So my last question is ... how do I change the HTML.BeginForm block to pass in both the files and form values? Right now I have ... ``` @using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })) { //do stuff } ``` What should that using statement be to get both form values and files as separate parameters of the ActionResult? EDIT MY EDIT It seems that I don't have to make any changes...the debugger is showing that both files and form are non-null. Cool! Is that right?

Original source