MVC。 HttpPostedFileBase始终为null

时间:2011-11-16 22:34:07

标签: asp.net-mvc-3

我需要一些帮助。我正在尝试使用<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();
}

问题是“files”总是包含两个null元素。 可以做些什么来解决它?

是时候发布一些消息了。好像我发现了问题,但我仍然不知道如何修复它。看来,尽管我在这里使用“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 个答案:

答案 0 :(得分:37)

问题是该字段的NAME需要与控制器参数匹配。 在您的情况下是“文件”...所以您的name属性也应该是“文件”。

答案 1 :(得分:31)

只需删除输入字段名称中的方括号:

@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控制器操作的示例中没有正确的签名文件列表,但我想这是由于您正在进行的一些测试。

答案 2 :(得分:7)

我遇到了同样的问题,但就我而言,我得到了解决方案。

[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 :(得分:3)

值得注意的是,如果您使用的是AJAX,那么上传将始终为null,因此请确保没有jquery AJAX附加到表单提交。

答案 4 :(得分:2)

你必须这样写:

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

答案 5 :(得分:1)

在我的情况下,y必须使用名称而不是id。

像这样:

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