在MVC4上复制模型中的多个文件

时间:2013-01-28 15:29:33

标签: http file-upload razor asp.net-mvc-4

所以,这是一个让我困扰的具有挑战性的问题。

我有一个“复杂”的模型结构:

ExpenseReport

  • 费用*

    • ExpenseFile *

ExpenseReport包含可能(或可能不)包含ExpenseFile对象列表的费用列表。

ExpenseFile对象包含(以及其他属性) byte [] 来存储文件数据。

我已经设法为此创建了整个视图,其中包含一个表格结构,用户可以在其中添加/删除费用到报表,在每个单独的费用行中,用户可以添加/删除ExpenseFile。所有这些都是使用jquery / ajax完成的。 ExpenseFile EditorTemplate包含一个

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

因此用户可以选择对应的文件。

模型结构(即Report,Expense和ExpenseFile对象层次结构)正确绑定,唯一的例外是ExpenseFiles的文件数据,它始终为null!

我知道输入文件可以通过

在控制器中访问
ControllerBlahBlah(... IEnumerable<HttpPostedFileBase> FileData)

或者我可以实现一个自定义的ModelBinder来获取像这样的文件数据

var file = controllerContext.HttpContext.Request.Files["FileData"] 
...

但是默认模型绑定器是否有办法将每个输入文件绑定到对应的ExpenseFile?

我问这个是因为如果没有,我可能需要实现一个自定义绑定器,这将是一个痛苦,因为我不知道如何弄清楚如何绑定每个

controllerContext.HttpContext.Request.Files["FileData"] 

到正确的档案。

感谢任何帮助/意见。

注意:

  • 其他所有内容都正确绑定,每个嵌套列表项都包含right prefixes等;

  • FileData是我的ExpenseFile模型中byte []属性的名称;

1 个答案:

答案 0 :(得分:1)

刚想通了。这是答案,以防有人遇到同样的问题:

  • 我在ExpenseFile模型视图中添加了一个HttpPostedFileBase属性;
  • 我创建了my own EditFor for HttpPostedFileBase;
  • 然后,在我的ExpenseFile视图中,我使用

    @ Html.EditorFor(model =&gt; model.postedFile)

而不是

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

现在,filedata绑定正确,我所要做的就是将HttpPostedFileBase的数据转换为服务器端的一个byte [](Controller)。