Загруженный HttpPostedFile имеет значение null
В представлении:
<% =Html.BeginForm("About", "Home", FormMethod.Post, new {enctype="multipart/form-data "})%>
<input type="file" name="postedFile" />
<input type="submit" name="upload" value="Upload" />
<% Html.EndForm(); %>
В контроллере есть что-то вроде этого:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult About(HttpPostedFile postedFile)
{
//but postedFile is null
View();
}
postedFile
имеет значение null в About(). Как загрузить файл?
Ответы
Ответ 1
Используйте HttpPostedFileBase (не HttpPostedFile), а также укажите параметр точно так же, как в форме. например. если у вас есть
<input type="file" id="file1" name="file1" />
у вас должен быть голова метода:
public ActionResult About(HttpPostedFileBase file1)
Ответ 2
Это не отвечает, почему ваш параметр имеет значение NULL, но вы можете запросить его напрямую. Возможно, это не самый "MVC" способ сделать это. попробуйте это в своем теле метода:
var upload = Request.Files["postedFile"]
if (upload.ContentLength > 0)
{
// Do whatever
}
Чтобы быть более "MVC", вы можете вывести этот код из своего контроллера в реализацию IModelBinder и использовать пользовательский объект в качестве параметра для вашего метода. Это сообщение Scott Hanselman показывает шаги по реализации пользовательского ModelBinder.
Ответ 3
У меня была та же проблема:
Вы должны определить имя И id для элемента ввода:
<input type="file" name="postedFile" id="postedFileId" />
С наилучшими пожеланиями
Стефан
Ответ 4
Какую версию MVC вы используете?
Прямо сейчас с кандидатом RC я попытался использовать HttpPostedFile, и я получил "не имеет пустой ошибки конструктора". Мне пришлось использовать HttpPostedFileBase.
Тем не менее, это версия версии MVC, в которой вы работаете, в зависимости от версии, как вы можете найти опубликованный файл.
Ответ 5
Вы должны удалить пробел из атрибута enctype:
new {enctype="multipart/form-data "} => new {enctype="multipart/form-data"}
Ответ 6
Пустое пространство после "multipart/form-data" является реальной проблемой...
Ответ 7
Вы используете jQuery mobile? если да, вам нужно установить @data_ajax в false
new { enctype = "multipart/form-data", @data_ajax = "false" }
Ответ 8
используйте этот
public ActionResult Upload(HttpPostedFileBase excelfile)
изменить HttpPostedFile
для HttpPostedFileBase
Ответ 9
Я также получаю некоторые причуды с <%= Html.BeginForm ...%>
. Итак, я использую использование. Опять же, на стороне контроллера, я просто хватаю загруженные файлы из объекта запроса.
Попробуйте это. Он работает:
<% using (Html.BeginForm("Post", "Home", FormMethod.Post, new {enctype = "multipart/form-data"}))
{%>
<input type="file" id="postedFile" name="PostedFile" />
<input type="submit" />
<%
}
% >
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Post(FormCollection form)
{
HttpPostedFileBase postedFile = Request.Files["PostedFile"];
return RedirectToAction("Index");
}
Ответ 10
Кроме того, я обнаружил, что декларация формы, в которой находится файл, должна всегда иметь
new {enctype="multipart/form-data"}
Ответ 11
Вот все биты, которые вам нужно для uplaod файла
//in your model
public partial class Profile
{
[DisplayName("Image Upload")]
[DataType(DataType.Upload)]
public HttpPostedFileBase FileUpload { get; set; }
}
// in your view
@model ProjName.Blabla.Profile
@using (Html.BeginForm("Edit", "Profile", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<input type="file" name="FileUpload" id="FileUpload" value="Choose File" class="form-control" />
<input type="submit" value="Save" class="btn btn-default" />
}
Ответ 12
<form id="Form1" method="post" encType="multipart/form-data" runat="server">
Добавьте encType="multipart/form-data"
в вашу форму.