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" в контроллере.
Ответы
Ответ 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" />