2012-10-24 9 views
8

Mam WWW ASP.NET MVC, która ma listę rozwijaną, która jest tworzona przy użyciu to w widoku ...Jak uzyskać pliki i wartości formularzy z witryny ASP.NET MVC 4?

@Html.DropDownList("Programs") 

Programów jest wypełniana z kolekcji firmy Object i nadziewane w ViewBag w indeksie działanie na Home Controller ...

\\get items... 
ViewBag.Programs = items; 

widok ma również potencjalnie trzy pliki Dostaję tak w tym samym widoku ...

<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" /> 

Wszystkie z wyżej wymienionych kontroli zawarte są w formie, która jest tworzona w widoku przy użyciu ...

@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" /> 
} 

Moje problemy to, że nie mogę znaleźć sposób, aby przetworzyć wszystkie pliki i odniesienie do pola formularza.

W szczególności muszę wiedzieć, jaki program wybrał użytkownik z menu rozwijanego.

mogę przetwarzać pliki przy użyciu tego kodu bez problemu ...

[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"); 
} 

Ale nie mogę zrozumieć, jak również uzyskać dostęp do wartości formularza POST zwłaszcza programów rozwijaną wybraną wartość (i dla rekordu jest też pole wyboru, z którego nie mogę odczytać wartości.) Fiddler pokazuje mi, że odpowiedź ma odwołania do pliku I wybranego programu, ale nie mogę wymyślić, jak je pobrać z POST za pomocą ASP.NET MVC.

Wiem, że to pytanie jest dość proste, ale wciąż uczę się całej strony internetowej/http nie tylko MVC.

EDYTOWANIE Dzięki za odpowiedzi. Miałem wrażenie, że odpowiedź może polegać na przekazywaniu zarówno plików, jak i wartości formularza do testu POST.

Moje ostatnie pytanie brzmi ... jak zmienić blok HTML.BeginForm, aby przekazać zarówno pliki, jak i wartości formularzy? W tej chwili mam ...

@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    //do stuff 
} 

Co należy używać, aby uzyskać wartości postaci i pliki jako oddzielne parametry ActionResult?

EDIT MY EDIT
Wydaje się, że nie trzeba wprowadzać żadnych zmian ... debugger pokazuje, że oba pliki i forma są niezerowe. Chłodny! Czy to prawda?

Odpowiedz

7

myślę, że powinien to zrobić

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

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

Powinieneś być w stanie przejść w 2 parametrów w [HttpPost] działania. możesz również podać nazwę HTML.

Edytowanie: Też miałem problemy z formularzami w ASP.net. Proponuję zaglądnąć do tego posta na blogu Scotta Allena. http://odetocode.com/blogs/scott/archive/2009/04/27/6-tips-for-asp-net-mvc-model-binding.aspx

1

Użyj typ ViewModel, który zawiera zarówno zamieszczonych plików i wartości formularza lub użyj HttpRequest (dostępnego za pośrednictwem Controller.Request własność) przedmiotu, który ma .Form[key] dla wartości Post i .Files[key] delegowanych plików.

Powiązane problemy