无法使用ASP.NET MVC2上传文件

时间:2010-06-24 18:50:26

标签: c# asp.net-mvc-2

我已将enctype设置为:multipart / form-data但是每当我提交此表单时,Request.ContentType为:application / x-www-form-urlencoded,并且无法从Request检索上传内容.Files。

这是我的观点:

    <% using (Html.BeginForm("Import", "Content", FormMethod.Post, new { enctype = "multipart/form-data" })) { %>

<p>
    <%= Html.CheckBox("DeleteExisting")%> Delete Existing Records?
</p>   

<p>
    <input type="file" name="FileUpload" id="FileUpload" /> Select a dump file.
</p>

<p>
    <input type="submit" value="Import Now" />
</p>

<% } %>

这是我的行动:

        [HttpPost]
    public ActionResult Import(FormCollection fc)
    {
        string chkDelete = fc["DeleteExisting"];
        //string filename = fc["FileUpload"];

        if (!chkDelete.Equals("false"))
        {
            //TODO: delete existing records, if specified
        }


        var inputFile = Request.Files["FileUpload"];


        return View();
    }

在PostBack中,填写了“fc”变量,我可以访问复选框的值,并可以获取上传的文件名。

为什么我的enctype会被忽略?

我尝试手动将表单标记放在视图中,属性位于不同的位置,但没有区别。

我唯一能想到的是这个导入表单嵌套在MasterPage的表单中,但这似乎不应该是一个问题。另外,我把这个表格妥善包围了。

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

我相信这里有两个问题:

  

我唯一能想到的是这个导入表单嵌套在MasterPage的表单中,但这似乎不应该是一个问题。另外,我把这个表格妥善包围了。

这可能是大多数问题 - 有两件事让我担心:

  1. 嵌套表单不合法(X)HTML - 允许浏览器忽略第二个表单声明,并在第一个表单标签处关闭表单 - 这很可能是您看到的问题
  2. 当我们处理ASP.NET MVC时,根本没有理由在主页面中有一个大的封闭形式,这只会妨碍(就像我们在这里看到的那样)。
  3. 我建议您从母版页中删除表单,只需在实际表单周围需要时添加它们。这可能很好地解决了你所看到的问题。

    其次,您需要根据HttpPostedFileBase为您的操作添加参数:

    public ActionResult Import(FormCollection fc, HttpPostedFileWrapper FileUpload)
    {
      string chkDelete = fc["DeleteExisting"];
    
      if (null != FileUpload && 0 < FileUpload.ContentLength) {
       // We have an upload.
    
       string filename = FileUpload.FileName;
    
        if (!chkDelete.Equals("false"))
        {
            //TODO: delete existing records, if specified
        }
    
        // Stream file in from FileUpload.InputStream e.g.:
        var bytesOriginal = new byte[FileUpload.ContentLength];
        FileUpload.InputStream.Read(bytesOriginal, 0, FileUpload.ContentLength);
    
        //Read from the byte array as you would any normal file.
      }
    
      return View();
    }
    

    我刚刚在一个简单的视图中尝试了这个(没有母版页,没有嵌套的表单),它的行为与我期望的完全一样 - 没有HttpPostedFileWrapper,FormCollection只包含复选框。