2010-01-20 3 views
1

asp.net mvc 1.0을 사용하여 HttpPostedFileBase를 바인딩 할 수 없습니다.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) 

는 이것은

<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" /> 

카테고리가 제대로 결합되어 내 HTML이지만, 파일은 항상 null입니다.

파일이 실제로 Request.Files 인 것을 확인했습니다.

HttpPostedFileBaseModelBinder

+1

내 머리 꼭대기에서 생각할 수있는 유일한 것 : 폼의 "enctype"속성이 "multipart/form-data"로 설정되어 있습니까? –

+0

예, 실제로 파일이 Request.Files에 있음을 확인했습니다. –

답변

1

. MVC 1에 대한 해결 방법 :

각각의 파일 업로드 요소 foo는를 들면,
<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는 .exists 숨겨진 입력 요소가 있습니다. 이로 인해 DefaultModelBinder의 단락 논리가 시작되지 않고 HPFB 속성을 올바르게 바인딩해야합니다.

+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. 모델 클래스 생성. global.asax.cs에서

using System.Web; 

namespace Web 
{ 
    public class PostedFileModel 
    { 
    public HttpPostedFileBase PostedFile { get; set; } 
    } 
} 

3.Entry 모델 바인더. 그들이 당신의 행동 방식에 모델 유형의 속성이 아닌 매개 변수라면 객체가 바인딩되지 않습니다 HttpPostedFileBase을 (MVC 2 RC에 고정) MVC 1의 버그가있어

protected void Application_Start() 
{ 
    RegisterRoutes(RouteTable.Routes); 
    ModelBinders.Binders[typeof(PostedFileModel)] = 
       new HttpPostedFileBaseModelBinder(); 
} 
+0

은 MVC 1.0 RTM –

+0

에 이미 구현되어 있습니다. 복잡한 유형의 HttpPostedFileBase를 바인딩 해제한다고 생각합니다. – takepara

관련 문제