カスタムモデルバインダーで要求コンテキストを手動で確認したり、投稿されたファイルのみを入力として受け取る別のアクションメソッドを作成したりせずに、投稿されたファイル(<input type="file" />
)をASP.NET MVCのモデルバインディングに参加させる方法はありますか?
私はこれがうまくいくと思っていたでしょう:
class MyModel {
public HttpPostedFileBase MyFile { get; set; }
public int? OtherProperty { get; set; }
}
<form enctype="multipart/form-data">
<input type="file" name="MyFile" />
<input type="text" name="OtherProperty" />
</form>
public ActionResult Create(MyModel myModel) { ... }
しかし、上記のシナリオを考えるMyFile
と、バインディングコンテキストの値プロバイダー値の一部でさえありません。(OtherProperty
もちろんです。)しかし、これを行うと機能します。
public ActionResult Create(HttpPostedFileBase postedFile, ...) { ... }
では、パラメーターがモデルの場合、なぜバインディングが発生しないのでしょうか。また、どうすればそれを機能させることができますか?カスタムモデルバインダーを使用しても問題はありませんが、カスタムモデルバインダーでこれを確認せずに行うにはどうすればよいRequest.Files["MyFile"]
ですか?
一貫性、明確性、テスト容易性のために、リクエストコンテキストを手動で検査することなく、投稿されたファイルにバインドされたプロパティを含む、モデル上のすべてのプロパティの自動バインドをコードで提供したいと思います。私は現在、ScottHanselmanが書いたアプローチを使用してモデルバインディングをテストしています。
それとも私はこれを間違った方法で行っていますか?これをどのように解決しますか?または、Request.FormとRequest.Filesの分離の歴史があるため、これは設計上不可能ですか?