MVC.HttpPostedFileBase всегда нулевой - PullRequest
31 голосов
/ 17 ноября 2011

Мне нужна помощь. Я пытаюсь загрузить файлы, используя <input type="file">. Вот мой взгляд:

@using (Html.BeginForm("BookAdd", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <input type="file" name="files[0]" id="files[0]" />
    <input type="file" name="files[1]" id="files[1]" />
    <input type="submit" value="Upload Book" />
}

А вот действие, которое должно обрабатывать загруженный файл.

[HttpPost]
public ActionResult BookAdd(IEnumerable<HttpPostedFileBase> files)
{
    // some actions
    return View();
}

Проблема в том, что «файлы» всегда содержат два элемента, которые являются нулевыми. Что можно сделать, чтобы это исправить?

Пришло время для некоторых новостей. Кажется, я нашел проблему, но я все еще не знаю, как ее исправить. Похоже, что несмотря на то, что я использую здесь «multipart / form-data»:

@using (Html.BeginForm("BookAdd", "Admin", FormMethod.Post, new { enctype="multipart/form-data" }))
{
    <input type="file" name="File" id="file1" />
    <input type="file" name="File" id="file2" />
    <input type="submit" value="Upload Book" />
}

Request.ContentType остается "application / x-www-forum-urlencoded" в контроллере.

Ответы [ 6 ]

37 голосов
/ 17 ноября 2011

Проблема в том, что ИМЯ поля должно совпадать с параметром контроллера. В вашем случае это «файлы» ... поэтому ваш атрибут name также должен быть «файлами».

31 голосов
/ 17 ноября 2011

Просто избавьтесь от квадратных скобок в именах полей ввода:

@using (Html.BeginForm("BookAdd", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <input type="file" name="files" id="file1" />
    <input type="file" name="files" id="file2" />
    <input type="submit" value="Upload Book" />
}

ОБНОВЛЕНИЕ:

После просмотра примера проекта вы прислали мне проблему,что у вас есть 2 вложенные формы.Это не разрешено в HTML.У вас есть одна форма в вашем _Layout.cshtml и другая форма в вашем BookAdd.cshtml представлении.Вот почему, несмотря на атрибут enctype="multipart/form-data" в вашей внутренней форме, вы ошиблись Request.ContentType.Таким образом, вам придется развернуть эти формы, если вы хотите, чтобы это работало.Также в примере, который вы мне прислали, у вашего действия контроллера BookAdd нет правильной подписи, в которой содержится список файлов, но я думаю, это связано с некоторыми тестами, которые вы выполняли.

7 голосов
/ 14 октября 2012

Я столкнулся с той же проблемой, но в моем случае я получил решение этой проблемы.

[HttpPost]
    public ActionResult Upload()
    {
        foreach (string file in Request.Files)
        {               
           fileurl = Request.Files[file];
        }
        return View();
    }

В режиме конструктора. Пожалуйста, закомментируйте тег формы <%-- <form id="form1" runat="server">--%>, если используете главную страницу ...Я надеюсь, что ваша проблема будет решена ...

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Upload
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

   <%-- <form id="form1" runat="server">--%>
  <% using (Html.BeginForm("Upload","Home",FormMethod.Post,new {enctype="multipart/form-data"}))
{ %>

<fieldset>
        <legend>Upload File</legend>
         <div>

          <p>
Select a File: <input type="file" name="FileUpload" />
<input type="submit" value="Upload" />
</p>
</div>
</fieldset>

<% } %>
3 голосов
/ 04 сентября 2012

Стоит отметить, что если вы используете AJAX, загрузка всегда будет проходить как ноль, поэтому убедитесь, что JQuery AJAX не присоединен к отправке формы.

2 голосов
/ 17 ноября 2011

Вы должны написать примерно так:

public class DocumentModelView 
{
        public HttpPostedFileBase File1 { get; set; }

        public HttpPostedFileBase File2 { get; set; }
}


@model Models.DocumentModelView

@using( Html.BeginForm( "Create", "Document", FormMethod.Post, new { enctype = "multipart/form-data" }) )
{
        <input type="file" name="File1" />
    <input type="file" name="File2" />
        <input type="submit" value="send" />
}


[HttpPost]
public ActionResult Create( DocumentModelView modelView )
{
.....
}
1 голос
/ 02 ноября 2016

В моем случае y пришлось использовать имя вместо идентификатора.

Вот так:

<input type="file" id="upload" name="upload" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...