是否有办法使 ASP.NET MVC 中的模型绑定可以自动处理提交的文件 (<input type="file" />
),而无需手动查看请求上下文中的自定义模型绑定器,并且不需要创建仅接受已提交文件作为输入的单独操作方法?
我原本以为这会起作用:
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之间的分离历史,这是不可能的设计?
enctype
属性。它必须指定为"multipart/form-data"
。否则,在 POST 请求中与输入标签上的name
属性匹配的HttpPostedFileBase
参数将保持为空值。 - Bart Verkoeijen