2010-03-05 5 views
4

나는 추상 클래스를 사용하는 간단한 Poco-Model을 가지고 있으며 Asp.net MVC 2의 기본 ModelBinder에서는 작동하지 않는 것으로 보인다. 하나의 항목에 컬렉션의 객체가 여러 개있다. 모두 동일한 추상 기본 클래스를 사용합니다.Asp.Net MVC 2 추상 클래스를 사용하는 DefaultModelBinder 오류

모델 :

public partial class Item 
    { 
     public virtual ICollection<Core.Object> Objects 
     { 
      get 
      { 
       return _objects; 
      } 
      set 
      {     
        if (value != _objects) 
        { 
         _objects = value; 
        } 
      } 
     } 
     private ICollection<Core.Object> _objects; 
    } 


public abstract partial class Object 
    { 

     public virtual Item Item 
     { 
      get 
      { 
       return _item; 
      } 
      set 
      { 
       if (!Object.ReferenceEquals(_item, value)) 
       { 
        _item = value; 
       } 
      } 
     } 
     private Item _item;  

    } 

    public partial class TextObject : Object 
    { 
     public virtual string Text { get; set; } 
    } 

인스턴스 : 나는 그 같은 HTML 입력 필드를 얻는 객체 컬렉션에서 하나의 TextObject와 해당 항목에 대한

var NewItem = new Item();      
var TextObject1 = new TextObject 
{ 
    Text = "Text Object Text", 
    Item = NewItem 
};      
List<Core.Object> objects = new List<Core.Object>(){TextObject1};    
NewItem.Objects = objects; 

기본 Html.EditorForModel을 사용하여() 도우미 :

<input class="text-box single-line" id="Objects_0__Text" name="Objects[0].Text" type="text" value="Text Object Text" /> 

컨트롤러에 다시 게시 할 때 "초록을 만들 수 없습니다. c 기본 ModelBinder에서 오류가 발생했습니다. 분명히 바인더는 추상 기본 클래스를 인스턴스화하려고합니다. 하지만 컬렉션에 상속 된 TextObject 유형의 객체 만 있기 때문에 왜 그런지 모르겠습니다. 사용자 정의 Modelbinder를 작성하지 않고도이 작업을 수행 할 수있는 다른 방법이 있습니까?

답변

3

사용자 정의 모델 바인더를 사용하거나 viewmodels를 사용해야합니다. 모델 바인더는 작업에 대한 매개 변수로 사용하는 유형 (추상 클래스 포함) 만 알고 있습니다. 그런 다음 요청의 값을 해당 모델에 매핑하려고 시도합니다. 바인더가 다른 구현을 사용해야한다는 것을 알 수있는 방법은 없습니다.

내 조언은 더 간단한보기 모델을 만들고 automapper을 사용하여 매핑하는 것입니다.

+1

감사에 대한 링크가 더 긴 토론, 나는 시도 automapper 줄 것이다. 파생 된 객체 유형의 n 개 목록을 viewmodel에 넣을 것을 권장 하시겠습니까? (목록 , 목록 등) – user250773

0

개체 클래스에서 개체 컬렉션을 ICollection<TextObject>으로 지정해야한다고 생각합니다. 그렇지 않으면 기본 모델 바인더가 어떤 개체를 만들어야하는지 알 수 없습니다. 사용자 정의 모델 바인더를 작성하기로 결정한 경우 모든 Object에 대해 유형을 나타내는 필드를 양식에 추가해야합니다. 감사합니다.

+0

TPT EF 모델이므로 ICollection 추상 정의를 고수해야합니다. 주문형 모델러는 유일한 해결책이라고 보입니다. – user250773

2

MvcContrib에서 DerivedTypeModelBinder를 확인하십시오. TypeStamping은 메타 데이터를 뷰 렌더링에 삽입하여 파생 된 형식의 모델 바인더에게 인스턴스화 할 개체를 적절히 호출하는 데 필요한 정보를 제공합니다. 이

MVC2 Modelbinder for List of derived objects