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" })
, чтобы все они были в этом списке.
Для получения дополнительной информации читайте здесь.