Подтвердить что ты не робот

MVC. HttpPostedFileBase всегда имеет значение null

Мне нужна помощь. Я пытаюсь загрузить файлы с помощью <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" в контроллере.

4b9b3361

Ответ 1

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

@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" />
}

UPDATE:

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

Ответ 2

Проблема заключается в том, что поле NAME должно совпадать с параметром контроллера. В вашем случае это "файлы"... поэтому ваш атрибут name также должен быть "файлами".

Ответ 3

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

[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>

<% } %>

Ответ 4

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

Ответ 5

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

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 )
{
.....
}

Ответ 6

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

Вот так:

<input type="file" id="upload" name="upload" />