Asp.net-Mvc

當參數為模型時,ASP.NET MVC 發布文件模型綁定

  • June 6, 2009

有沒有辦法讓發布的文件 ( <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"]

為了一致性、清晰性和可測試性,我希望我的程式碼能夠自動綁定模型上的所有屬性,包括綁定到已發布文件的屬性,而無需手動檢查請求上下文。我目前正在使用Scott Hanselman 所寫的方法測試模型綁定。

還是我以錯誤的方式解決這個問題?你會如何解決這個問題?或者由於 Request.Form 和 Request.Files 之間的分離歷史,這是設計上不可能的?

事實證明,原因是ValueProviderDictionary只在模型綁定上下文中查找和填充值提供者Request.Form字典RouteDataRequest.QueryString因此,自定義模型綁定器無法在不直接檢查請求上下文中的文件集合的情況下允許發布的文件參與模型綁定。這是我發現完成同樣事情的最接近的方法:

public ActionResult Create(MyModel myModel, HttpPostedFileBase myModelFile) { }

只要myModelFile實際上是file輸入表單欄位的名稱,就不需要任何自定義的東西。

引用自:https://stackoverflow.com/questions/960687