无法在Asp.Net MVC 1.0中正确绑定HttpPostedFileBase

时间:2010-01-20 13:58:02

标签: asp.net-mvc file-upload

我不能让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,因此无法弄清楚出了什么问题。

2 个答案:

答案 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属性。