1

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

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

费用报表

  • 费用*

    • 费用档案*

一个 ExpenseReport 包含一个 Expenses 列表,它可能(或可能不)包含一个 ExpenseFile 对象列表。

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

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

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

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

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

我知道输入文件可以在控制器中通过

ControllerBlahBlah(... IEnumerable<HttpPostedFileBase> FileData)

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

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

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

我问这个是因为如果没有,我可能不得不实现一个自定义活页夹,这会很痛苦,因为我不知道如何弄清楚如何绑定每个活页夹

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

到正确的文件。

任何帮助/想法表示赞赏。

笔记:

  • 其他一切都正确绑定,每个嵌套列表项都包含正确的前缀等;

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

4

1 回答 1

1

刚刚想通了。这是答案,以防有人偶然发现同样的问题:

  • 我在我的 ExpenseFile 模型视图上添加了一个 HttpPostedFileBase 属性;
  • 我为 HttpPostedFileBase 创建了自己的 EditFor
  • 然后,在我的 ExpenseFile 视图中,我使用

    @Html.EditorFor(model => model.postedFile)

代替

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

现在文件数据正确绑定,我所要做的就是将 HttpPostedFileBase 的数据转换为服务器端(控制器)上的 byte[]。

于 2013-01-29T08:38:55.723 回答