1

だから、これが私を悩ませてきた挑戦的なものです。

私は「複雑な」モデル構造を持っています:

経費報告書

  • 費用*

    • ExpenseFile *

ExpenseReportには、ExpenseFileオブジェクトのリストが含まれる場合と含まれない場合があるExpensesのリストが含まれます。

ExpenseFileオブジェクトには、(他の属性の中でも)ファイルデータを格納するためのbyte[]が含まれています。

私はすでにこのためのビュー全体を作成することができました。これは、ユーザーが経費をレポートに追加/削除でき、個々の経費行でユーザーがExpenseFileを追加/削除できる表形式の構造で構成されています。それはすべてjquery/ajaxを使用して行われます。ExpenseFileEditorTemplateには

<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"] 

右のファイルに。

任意のヘルプ/アイデアをいただければ幸いです。

ノート:

  • 他のすべては正しくバインドされており、ネストされた各リストアイテムには正しいプレフィックスなどが含まれています。

  • FileDataは、私のExpenseFileモデルのbyte[]プロパティの名前です。

4

1 に答える 1

1

ちょうどそれを理解しました。誰かが同じ問題に遭遇した場合の答えは次のとおりです。

  • ExpenseFileモデルビューにHttpPostedFileBaseプロパティを追加しました。
  • HttpPostedFileBase用に独自のEditForを作成しました。
  • 次に、ExpenseFileビューで、

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

それ以外の

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

これで、filedataが正しくバインドされ、サーバー側(Controller)でHttpPostedFileBaseのデータをbyte[]に変換するだけで済みます。

于 2013-01-29T08:38:55.723 に答える