所以,这是一个让我困扰的具有挑战性的问题。
我有一个“复杂”的模型结构:
ExpenseReport
费用*
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 []属性的名称;
答案 0 :(得分:1)
刚想通了。这是答案,以防有人遇到同样的问题:
然后,在我的ExpenseFile视图中,我使用
@ Html.EditorFor(model =&gt; model.postedFile)
而不是
<input type="file" name="FileData" id="FileData" />
现在,filedata绑定正确,我所要做的就是将HttpPostedFileBase的数据转换为服务器端的一个byte [](Controller)。