0

나는 기능사용자 정의 모델 바인딩에서 어떤 메소드 또는 특성을 겹쳐 써야합니까?

1) 클래스 속성에 양식/쿼리 속성의 매핑을 가능하게하는 일반적인, 재사용 사용자 정의 바인더의 두 조각을 필요로하는 MVC 응용 프로그램에 대한 사용자 지정 바인딩 시나리오를 가지고있다.

2) A 클래스 특정 주어진 폼/쿼리 매개 변수를 사전 (또는 두 개의 속성)으로 분할하는 사용자 지정 바인더.

첫 번째 요구 사항은 Google을 통해 발견 된 해결책으로 완성되었습니다 (내가 찾은 위치를 잊어 버렸기 때문에 링크를 제공 할 수 없다는 사과를드립니다).

은 본질적으로, 두 번째 조각

public class AliasModelBinder : DefaultModelBinder { 
    ... 
    protected override ProperyDescriptorCollection GetModelProperties(ControllerContext controllerContext, ModelBindingContext bindingContext) { 
     var returnProps = base.GetModelProperties(controllerContext, bindingContext); 

     // check model for properties with alias attribute 
     // add additional PropertyDescriptors as needed 
    } 
    ... 
} 

내 문제되는으로

public class SearchRequest { 
    ... 
    [BindAlias("q")] 
    public string SearchTerms { get; set; } 
    ... 
} 

같은 요구 사항 # 2 함께 사용됩니다 두 가지

public class BindAliasAttribute : Attribute { 
    ... 
    public string Alias { get; set; } 
    ... 
} 

있다. 이 경우에, 사전의 키 필드 이름 및 사전 항목의 값이다 SearchRequest에 클래스

public class SearchRequest { 
    ... 
    [BindAlias("q")] 
    public string SearchTerms { get; set; } 
    ... 
    [BindAlias("s")] 
    public IDictionary<string, string> SortOrder { get; set; } 
    ... 
} 

에 추가 속성 순서 (오름차순 또는 내림차순)

거기이다

/Search?...s=Score DESC... 
/Search?...s=ModifiedDate ASC&s=OwningUser DESC... 

내가 양식을 결합해야하는 논리의 샘플 사용은/쿼리 값은

// loop through each form/query parameter of SortOrder or s 
// get the value and split it on the space 
// add thw two split values to the SortOrder property as new dictionary item 
같은 것 0

다시 DefaultModelBinder ... 또는이 경우에는 AliasModelBinder (차례로 DefaultModelBinder에서 상속)에서 상속해야한다는 것을 알고 있지만 별칭을 지원하기 위해 문제를 해결할 방법이 확실하지 않습니다. DefaultModelBinder를 재사용하는 최선의 방법에 대한 정보는 거의 없다 (거의 없음).

내 다른 질문은 두 가지 사용자 지정 모델 바인더를 사용하는 가장 좋은 방법입니다. 제가 아는 한 모델 바인더 체인이 없습니다. 솔루션 # 1에 대해 명확하게 알 필요가있는 # 2의 솔루션없이 요구 사항 # 2를 달성 할 수있는 방법이 있습니까? 요구 사항 # 2는 단일 값을 취하여 사전으로 분할하는 것에 대한 것입니다. 별칭이 지정된 양식/쿼리 매개 변수에서 SortOrder 속성의 값을 얻었습니다.

도움을 주시면 감사하겠습니다.

감사합니다.

제이슨

답변

2

나는 주로 내가 아주 드물게 BindModel을 무시 없지만했다 경우에 OnModelUpdated()를 오버라이드 (override)되어있다. OnModelUpdated에서 모델은 이미 수화되어 있지만 컨트롤러 및 ModelBinding 컨텍스트에 대한 모든 액세스 권한은 물론 적합하다고 생각되는 방식으로 모델을 변경할 수 있습니다.

+0

제안에 따라 OnModelUpdated 메서드가 호출 될 때까지 모델이 만들어지고 설정할 수있는 모든 속성이 설정됩니다. 그때 나는 SortOrder 속성을 "채우기"로 이동해야합니까? – Jason

+0

예, 그것이 제가 의미했던 것입니다. – JTMon

+0

그 특별한 방법을 사용하지는 않았지만 기본 논리를 사용하여 모델을 만든 다음 나중에 특수 논리를 추가하는 일반적인 아이디어를 사용했습니다. 본질적으로 당신은 나의 원래 접근 방식을 확인했습니다. 감사. – Jason