Не удается заставить HttpPostedFileBase правильно связываться в Asp.Net MVC 1.0 - PullRequest
1 голос
/ 20 января 2010

У меня не может быть 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 ]

1 голос
/ 20 января 2010

В 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.

1 голос
/ 20 января 2010

Это спецификация.

Компьютер Дзэн Скотта Хансельмана - Выпущена бета-версия ASP.NET MVC - Охлаждение означает

Это пример кода связующего для базовой модели 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...