我不能让asp.net mvc 1.0为我绑定HttpPostedFileBase。
这是我的EditModel类。
public class PageFileEditModel
{
public HttpPostedFileBase File { get; set; }
public string Category { get; set; }
}
这是我的编辑方法标题。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formCollection, PageFileEditModel[] pageFiles)
这是我的HTML
<input type="file" name="pageFiles[0].File" />
<input type="text" name="pageFiles[0].Category" />
<input type="file" name="pageFiles[1].File" />
<input type="text" name="pageFiles[1].Category" />
类别绑定正确,但文件始终为空。
我已经确认文件确实在Request.Files
。
默认添加HttpPostedFileBaseModelBinder
,因此无法弄清楚出了什么问题。
答案 0 :(得分:1)
这是一个规范。
Scott Hanselman's Computer Zen - ASP.NET MVC Beta released - Coolness Ensues
这是V1 RTW基础模型绑定器示例代码。
1.制作自定义模型装订器。
using System.Web.Mvc;
namespace Web
{
public class HttpPostedFileBaseModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
var bind = new PostedFileModel();
var bindKey = (string.IsNullOrEmpty(bindingContext.ModelName) ?
"" : bindingContext.ModelName + ".") + "PostedFile";
bind.PostedFile = controllerContext.HttpContext.Request.Files[bindKey];
return bind;
}
}
}
2.创建模型类。
using System.Web;
namespace Web
{
public class PostedFileModel
{
public HttpPostedFileBase PostedFile { get; set; }
}
}
3. global.asax.cs中的条目模型绑定器。
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
ModelBinders.Binders[typeof(PostedFileModel)] =
new HttpPostedFileBaseModelBinder();
}
答案 1 :(得分:1)
MVC 1中存在一个错误(在MVC 2 RC中已修复),如果HttpPostedFileBase对象是模型类型的属性而不是操作方法的参数,则它们不会被绑定。 MVC 1的解决方法:
<input type="file" name="theFile[0]" />
<input type="hidden" name="theFile[0].exists" value="true" />
<input type="file" name="theFile[1]" />
<input type="hidden" name="theFile[1].exists" value="true" />
也就是说,对于每个文件上传元素 foo 都有 foo .exists隐藏的输入元素。这将导致DefaultModelBinder的短路逻辑无法启动,并且应正确绑定HPFB属性。