2012-07-27 5 views
0

다음과 같이 DefaultModelBinder를 상속하는 사용자 정의 모델 바인더가 있습니다. BindModel은 목록/컬렉션에 바인딩 할 때 null을 반환합니다 (그러나 csla 컬렉션에 바인딩 할 때는 아님)

Public Class GridFormBinder : Inherits DefaultModelBinder 

Public Overrides Function BindModel(controllerContext As System.Web.Mvc.ControllerContext, bindingContext As System.Web.Mvc.ModelBindingContext) As Object 
    Dim result As Object = MyBase.BindModel(controllerContext, bindingContext) 

    'Code to handle special case for grid/List binding. 

    Return result 
End Function 
End Class 

나는이 사용자 정의 바인더가 이유

내가 (DevExpress의 MVC의 gridview를 사용하여) 그리드에서 항목의 다양한 목록을 제시하고 있는데이 항목의 목록에 그리드 컨트롤을 결합한다는 것입니다.

매우 수정 된 CSLA 프레임 워크 클래스의 BusinessCollectionBase에서 파생 된 클래스를 사용하는 경우 모든 것이 정확히 원하는대로 작동합니다. BusinessCollectionBase은 ...처럼 보이는 클래스에서

<Serializable()> Public MustInherit Class BindableCollectionBase(Of T As IBusinessData) 
     Inherits CollectionBase 
     Implements IBindingList 
     Implements System.Collections.Generic.IEnumerable(Of T) 

을 유도하지만 BindingList<Customer>에서 상속하는 클래스, 말, 바인딩 경우 MyBase.BindModel(controllerContext, bindingContext)은 항상 아무 것도 반환하지 않습니다. 나는 다양한 일반 및 비 제네릭 BCL 컬렉션을 시도하고 BindModel 메서드는 항상 null을 반환합니다.

DefaultModelBinder에서 일반 컬렉션의 모델을 만들고 반환하려면 어떻게해야합니까?

답변

1

나는 DefaultModelBinder의 소스를보고 문제를 알아 냈습니다. BindComplexModel 방법에서 DefaultModelBinder에서

타입 배열되지 않고, 일반 IEnumerable을 (를 IEnumerable <>)이며이 ICollection에 < 인스턴스 경우> 그 UpdateCollection를 호출한다. 명시된 모든 이유로 컬렉션을 채울 수 없습니다. count = 0이므로 UpdateCollection 메서드는 null을 반환합니다. 그래서 ICollection (예를 들어 BindingList)에서 파생 된 클래스는이 동작을합니다.

그러나 내 사용자 지정 컬렉션은 실제로 이전 CollectionBase 클래스에서 파생됩니다 (일반 IEnumerable을 seperatly로 구현 함). 즉, BindComplexModel이 컬렉션을 채우려 고 시도하지 않고 대신 정상적으로 개체에 바인딩합니다. *

개인적으로 이것은 버그 또는 최소한의 감독이라고 생각합니다. 컬렉션에 바인딩하고 폼에 0 개의 항목이있는 경우 (사용자가 모든 행을 삭제 한 경우) 기본 바인딩에서 아무 것도 반환하지 않습니다. 하지만 당신은 단지 아이템이없는 콜렉션을 가져야하지 않습니까? 아무것도 반환하지 않은 이유는 무엇입니까? 이것은 MVC 개발자에게 더 많은 작업을 요구합니다. 왜냐하면 이제 그들은 아무것도 확인하지 않아야하기 때문입니다.

하지만 어쨌든 이것이 이유입니다.

* 내 클래스를 사용하기 위해 모음에 바인딩 예제를 가져올 수없는 이유이기도합니다. 배열이 아니지만 IEnumerable <> 또는 IDictionary <>이 아닙니다. 또 다른 버그라고 생각합니다.

관련 문제