Загруженный 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" в вашу форму.