2009-06-09 3 views
36

을 한 바인딩.ASP.NET MVC 혼합 사용자 정의 및 기본 모델은 내가 유형은

기본 모델 바인더를 호출하여 Range 개체를 반환하는 방법이 있습니까? 난 그냥 ModelBindingContext 제대로 설치해야한다고 생각하지만, 어떻게 해야할지 모르겠다. 첫 번째 주석과 답변을 보면 편집


는 - 그것은 도움이 될 수있는 기본 모델 바인더에서 상속처럼 보인다.

지금까지 내가 가진 내 설치에 대한 더 많은 세부 사항을 추가하려면 :

public IssueFormModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     Order = //code to pull the OrderNumber from the context and create an Order 
     Item = //code to pull the ItemNumber from the context and create an Item 

     IssueForm form = IssueFormFactory.Create(Order, Item); 

     form.Range = // ** I'd like to replace my code with a call to the default binder ** 

     return form 
    } 
} 

이것은 그 일의 바보 같은 방법이 될 수 있습니다 ... 이것은 내 첫 번째 모델 바인더입니다. 내 현재 구현을 지적하십시오. 그래서 답변


편집 # 2

내가 같은 "나는 모든 바인딩 끝났어요"방법에 후크와 속성을 사용하여 팩토리 메소드를 호출 할 수있는 경우 BindProperty가 작동 오버라이드 (override)합니다.

나는 DefaultModelBinder 구현을 살펴보고 바보 같은 짓을 그만 두어야한다고 생각한다. DefaultModelBinder에서

public class CustomModelBinder : DefaultModelBinder { 
    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) { 
     if(propertyDescriptor.Name == "Order") { 
      ... 
      return; 
     } 

     if(propertyDescriptor.Name == "Item") { 
      ... 
      return; 
     } 

     base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
    } 

} 
+1

가장 세련된 솔루션인지 확실하지 않지만 IModelBinder를 구현하는 대신 DefaultModelBinder에서 사용자 정의 모델 바인더를 파생시킬 수 있습니까? 그런 다음 BindModel을 재정의 할 때 책임을 DefaultModelBinder로 전달합니다. 그렇지 않으면 사용자 정의 바인딩을 사용하십시오. –

+0

Yah, IModelBinder 및 DefaultModelBinder에서 일부 모델 바인더가 표시됩니다. DefaultModelBinder에는 BindModel 메서드에서 호출한다고 가정하는 몇 가지 추가 메서드가 있으므로 필요에 더 집중할 수 있습니까? – anonymous

+0

ModelBinder 및 코드 입력 처리 및 유효성 검사를 수동으로 무시하기로 결정했습니다. 이제는 일관되고, 투명하며, 현재와 미래의 필요에 맞게 조정할 수 있습니다. – User

답변

24

는 다음과 같이 시도

public class CustomModelBinder:DefaultModelBinder 
     { 
      protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor) 
      { 
       if (propertyDescriptor.PropertyType == typeof(Range)) 
       { 
        base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
       } 
       // bind the other properties here 
      } 
     } 
+0

나는 여기 바보가 될 가능성이 있지만 CustomModelBinder 클래스를 구현하는 방법은 분명히 이것이 작동하도록 어딘가에서 인스턴스화되어야 하는가? 어쩌면 ActionResult 매개 변수의 특성으로? –

49

오버라이드 BindProperty :

+20

+1 대신 영감 속성 유형을 사용하십시오. 마법의 끈을 비난하십시오! –

6

을 나는 두 개의 서로 다른 사용자 정의 모델 바인더, 주문 용 및 항목에 대한 하나를 등록 것이라고 생각, 기본 모델 바인더가 Range 및 IssueForm을 처리하도록합니다.

+4

네, 분명히 제가이 질문을한지 얼마되지 않았습니다. 결국 DefaultModelBinder 코드를 살펴보고 모델 바인딩의 재귀 적 성격을 실현했습니다. 복잡한 유형의 다른 복잡한 유형을 포함하고 있다는 것을 깨닫지 못했습니다. 각 유형의 모델 바인더를 개별적으로 정의 할 수 있습니다. 나는 대신 복잡한 부모가 각 복잡한 자녀의 세부 사항을 알아야한다고 생각했습니다. – anonymous

관련 문제