2010-02-19 2 views
2

ASP.Net MVC 모델 바인더 내에서 바인딩 된 형식의 개체를 만든 다음 해당 개체의 속성을 업데이트 할 수 있습니다.Asp.net MVC의 기존 개체에 데이터 바인딩

나는 BindModel (아이) 호출과 비슷한이 있는지 알고 싶어이 코드에서

public override object BindModel(ControllerContext controllerContext, 
    ModelBindingContext bindingContext) 
{ 
    ParentType boundModel = null; 
    if (bindingContext.ModelType == typeof(ParentType)) 
    { 
     var myFactory = new MyFactory(); 
     var someValue = bindingContext.ValueProvider.GetValue 
      ("someFieldId").AttemptedValue; 
     ChildType child = myFactory.Create(someValue); 
     BindModel(child); 
     boundModel = child; 
    } 
    return boundModel; 
} 

, 종류의 컨트롤러에서 TryModelUpdate()와 같은?

+0

유스 케이스 란 무엇입니까? –

+0

두 개의 하위 클래스가 있고 인스턴스화되는 것은 "someFieldId"라는 ID가있는 드롭 다운 목록을 기반으로합니다. 그래서 공장을 사용하여 Child 클래스를 인스턴스화하고 TryUpdateModel/BindModel 호출을 사용하여 폼의 모든 Parent 속성을 업데이트하고 싶습니다. 나는 바운드 모델을 컨트롤러에 전달하는 것을 좋아할 것이다. –

답변

1

당신의 문제에 대한 더 나은 접근 방식은 DefaultModelBinder (아마도 당신이 생각하는 것)에서 파생 된 다음 BindModel 메서드 대신 CreateModel 메서드를 재정의하는 것이라고 생각합니다.

Child 객체를 반환하면 찾으려는 경로를 따라야합니다.

+0

완벽한 솔루션 인 것처럼 보입니다. 내가 시도해보고 돌려 줄거야 :-) –

0
public override object BindModel(ControllerContext controllerContext, 
           ModelBindingContext bindingContext) 
{ 
    ParentType boundModel = null; 
    if (bindingContext.ModelType == typeof(ParentType)) 
    { 
     var myFactory = new MyFactory(); 
     var someValue = bindingContext.ValueProvider 
             .GetValue("someFieldId").AttemptedValue; 
     ChildType child = myFactory.Create(someValue); 
     BindModel(child); 
     boundModel = child; 
    } 

    // change here 
    bindingContext.ModelMetadata.Model = boundModel; 
    return BindModel(controllerContext, bindingContext); 
} 

어때?

+0

불행하게도 'BindModel (child)'메서드가 존재하지 않는다. 그건 내 예제 코드의 문제였다. :-( –

0

바인더는 클래스 속성과 필드 값에 동일한 이름이 필요하기 때문에 updatemodel을 호출하면 일치하는 값이 모델에 배치됩니다.

그래서 클래스 중 하나를 만들고 updatemodel을 호출 할 수 있어야합니까 ???