Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 507
Seth Spearman Avatar asked Oct 24 '12 21:10

Seth Spearman


People also ask

How can we get data from database in view in MVC?

Go to File, then New and click Project. Select ASP.NET MVC 4 Web Application and enter the project name, then click OK, select Empty, select View Engine Razor and press OK. Run the project.

How can I get data from Web API in MVC controller?

First of all, create MVC controller class called StudentController in the Controllers folder as shown below. Right click on the Controllers folder > Add.. > select Controller.. Step 2: We need to access Web API in the Index() action method using HttpClient as shown below.


2 Answers

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

like image 59
Ammar Avatar answered Nov 11 '22 12:11

Ammar


Use a ViewModel type that contains both the posted files and form values, or use the HttpRequest (accessed via the Controller.Request property) object, which has .Form[key] for POST values and .Files[key] for posted files.

like image 44
Dai Avatar answered Nov 11 '22 11:11

Dai