2010-06-24 46 views
4

我已经将enctype设置为:multipart/form-data然而,无论何时我提交此表单,Request.ContentType是:application/x-www-form-urlencoded和内容的上传无法从Request.Files中检索。无法上传文件与ASP.NET MVC2

这是我的观点:

<% 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(); 
    } 

在回传时,“FC”可变填充,我可以访问该复选框的值,可以得到上传的文件名。

为什么我的enctype会被忽略?

我试过手动将窗体标签放在视图中,属性位于不同位置,但这并没有什么区别。

我唯一能想到的就是这个Import表单嵌套在MasterPage的表单中,但这看起来不像是一个问题。另外我有这个表格正确包含。

有什么建议吗?

回答

4

我相信在起作用这里有两个问题:

我能想到的唯一的事情是,这个导入表格嵌套母版的形式内,但似乎并不像它应该是一个问题。另外我有这个表格正确包含。

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

  1. 嵌套的形式是不合法的(X)HTML - 浏览器是相当合理允许忽略第二种形式的声明,然后在第一个窗体标签处关闭窗体 - 这样就可能成为您所看到的问题。
  2. 因为我们正在处理ASP.NET MVC,所以在主页面中没有任何理由要有一个大的封闭表单,这只会妨碍我们(就像我们可能在这里看到的那样)。

我建议您从母版页中删除表单,并在需要时将它们添加到实际表单中。这可能很好地解决了你所看到的问题。

其次,你需要添加一个基于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只包含复选框。

+0

你不应该需要额外的参数。 – 2010-06-24 19:09:23

+0

@jacerhea嗯,这可能是从我最初在v1中创建它的时候挂起来的,并且使用没有任何位置放置上传文件的ViewModel,以及所有在线参考文献指出我无法获得上传的文件出来FormCollection ... – 2010-06-24 19:19:15

+0

感谢您的快速回复本,但HttpPostedFileBase参数没有帮助。回邮后为空。 – 2010-06-24 19:21:48