Mvc загружать файл с помощью модели - второй файл с параметрами

У меня есть простая модель с 1 строковым свойством, которое я визуализирую на простом представлении.

вид выглядит следующим образом:

@using (Html.BeginForm("UploadFile", "Home", FormMethod.Post, new { encType="multipart/form-data" }))
{
    @Html.TextBoxFor(m => m.FirstName)
    <br /><br />

    <input type="file" name="fileUpload" /><br /><br />
    <input type="submit" value="submit me" name="submitme" id="submitme" />
}

Контроллер:

[HttpPost]
public ActionResult UploadFile(UploadFileModel model, HttpPostedFileBase file)
{
   // DO Stuff
   return View(model);
}

Теперь, когда я отправляю, модель заполняется, а второй параметр HttpPostedFileBase имеет значение null. Однако при выполнении Request.Files - похоже, что есть файл в объявляемом Запросе. Как я могу получить второй параметр для привязки?

Ответы

Ответ 1

Почему бы не добавить загруженные файлы в вашу модель следующим образом:

public class UploadFileModel 
{
    public UploadFileModel()
    {
        Files = new List<HttpPostedFileBase>();
    }

    public List<HttpPostedFileBase> Files { get; set; }
    public string FirstName { get; set; }
    // Rest of model details
}

Затем измените свое мнение на следующее:

@using (Html.BeginForm("UploadFile", "Home", FormMethod.Post, new { encType="multipart/form-data" }))
{
    @Html.TextBoxFor(m => m.FirstName)
    <br /><br />

    @Html.TextBoxFor(m => m.Files, new { type = "file", name = "Files" })<br /><br />
    <input type="submit" value="submit me" name="submitme" id="submitme" />
}

Затем ваши файлы будут отправлены назад следующим образом:

public ActionResult UploadFile(UploadFileModel model)
{
    var file = model.Files[0];
    return View(model);
}

Ответ 2

Измените свое имя file на fileUpload и enctype его работу

@using (Html.BeginForm("UploadFile", "Home", FormMethod.Post, new { enctype="multipart/form-data" }))
{
    @Html.TextBoxFor(m => m.FirstName)
    <br /><br />

    <input type="file" name="fileUpload" /><br /><br />
    <input type="submit" value="submit me" name="submitme" id="submitme" />
}

[HttpPost]
public ActionResult UploadFile(UploadFileModel model, HttpPostedFileBase fileUpload)
{
   // DO Stuff
   return View(model);
}

Ответ 3

Для работы с одним вводом файла вы можете определить свойство HttpPostedFileBase в ViewModel:

public class SomeModel() 
{ 
    public SomeModel() 
    {
    }

    public HttpPostedFileBase SomeFile { get; set; }
}

И затем реализуйте его следующим образом:

Вид:

@model SomeModel

@using (Html.BeginForm(
    "Submit", 
    "Home", 
    FormMethod.Post, 
    new { enctype="multipart/form-data" }))
{
    @Html.TextBoxFor(m => m.SomeFile, new { type = "file" })
    <input type="submit" value="Upload" 
        name="UploadButton" id="UploadButton" />
}

Контроллер:

[HttpPost]
public ActionResult Submit(SomeModel model)
{
    // do something with model.SomeFile

    return View();
}

Если вам нужно иметь дело с несколькими файлами, вы можете:

  • создать несколько свойств и реализовать их отдельно, как и выше,
  • измените свойство public HttpPostedFileBase SomeFile на что-то вроде public List<HttpPostedFileBase> SomeFiles, а затем запустите несколько элементов управления @Html.TextBoxFor(m => m.SomeFile, new { type = "file" }), чтобы все они были в этом списке.

Для получения дополнительной информации читайте здесь.