Как получить файлы и значения формы из ASP.NET веб-сайт MVC 4?

у меня есть ASP.NET веб-сайт MVC с раскрывающимся списком, который создается с помощью этого в представлении...

@Html.DropDownList("Programs")

программы заполняются из коллекции бизнес-объектов и заполняются в ViewBag в действии индекса на домашнем контроллере...

get items...
ViewBag.Programs = items;

представление также потенциально имеет три файла, которые я получаю в том же представлении...

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

все вышеупомянутые элементы управления содержатся в форме, которая создается в вид с помощью...

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

мои проблемы в том, что я не могу найти способ обработать все файлы и ссылаться на поля формы.

в частности, мне нужно знать, какую программу пользователь выбрал из раскрывающегося списка.

Я могу обрабатывать файлы с помощью этого кода без проблем...

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

но я не могу понять, как также получить доступ к значениям формы POST, особенно к выбранному значению раскрывающегося списка программ (и для записи есть также флажок, из которого я не могу прочитать значение.) Fiddler показывает мне, что в ответе есть ссылки на файлы и выбранная программа, но я не могу понять, как получить их из сообщения, используя ASP.NET MVC.

Я знаю, что этот вопрос довольно простой, но я все еще изучаю всю вещь web/http, а не только MVC.

редактировать Спасибо за ответы. У меня была мысль, что ответ может лежать в передаче Как файлов, так и значений формы в пост.

Итак, мой последний вопрос ... как изменить HTML.Блок BeginForm для передачи как файлов, так и значений формы? Сейчас да ...

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

каким должен быть оператор using для получения значений формы и файлов в качестве отдельных параметров ActionResult?

EDIT MY EDIT
Кажется, мне не нужно ничего менять...отладчик показывает, что и файлы, и форма не имеют значения null. Круто! Заключаться в том правильно?

2 ответов


Я думаю, что это должно помочь

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

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

вы должны иметь возможность передать 2 параметра в действии [HttpPost]. вы также можете передать имя HTML.

Edit: у меня также были проблемы с формами в ASP.net - ... Я предлагаю посмотреть этот пост в блоге Скотта Аллена. http://odetocode.com/blogs/scott/archive/2009/04/27/6-tips-for-asp-net-mvc-model-binding.aspx


используйте тип ViewModel, который содержит как отправленные файлы, так и значения формы, или используйте HttpRequest (доступ через Controller.Request свойства объекта), которое .Form[key] для значений POST и .Files[key] за размещенные файлы.