2010-03-05 1 views
4

У меня есть простая Poco-модель, использующая абстрактные классы и, похоже, не работает с ModelBinder по умолчанию для Asp.net MVC 2. В одном элементе есть несколько объектов в коллекции , все с использованием того же абстрактного базового класса.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; } 
    } 

Instance:

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() Helper для этого элемента с одним TextObject в коллекции Objects я получаю HTML ввода-поле подобное :

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

При отправке обратно на контроллер я получаю сообщение «Невозможно создать абстрактный c lass "Errormessage из Default ModelBinder. Очевидно, связующее пытается создать этот абстрактный базовый класс. Но я не знаю, почему, поскольку в коллекции есть только объект унаследованного типа TextObject. Есть ли какой-либо другой способ заставить это работать без написания пользовательского Modelbinder?

ответ

3

Вам нужно будет использовать настраиваемое связующее устройство или использовать режимы просмотра. Модельное связующее только знает о типе, который вы используете в качестве параметра для своего действия (содержит абстрактный класс). Затем он пытается сопоставить значения из запроса к этой модели. Связующий агент не знает, что он должен использовать какую-то другую реализацию и какую реализацию может быть.

Мой совет - создать модели, которые проще и сопоставить их, используя automapper.

+1

Спасибо, я дам automapper попробовать. Вы бы порекомендовали иметь n списков производных типов объектов, а затем в viewmodel? (Список , Список и т. Д.) – user250773

0

Я думаю, вам нужно будет указать в классе предметов коллекцию объектов как ICollection<TextObject>. В противном случае было бы невозможным, чтобы стандартное связующее устройство было понятным, какой объект он должен создать. Если вы решили создать настраиваемое связующее устройство, вам нужно добавить в форму для каждого объекта поле, указывающее его тип. С уважением.

+0

Поскольку это модель TPT EF, мне нужно придерживаться абстрактного определения ICollection . Кажется, что единственное решение - это custombobject. – user250773

2

Проверьте DerivedTypeModelBinder в MvcContrib. TypeStamping внедряет метаданные в рендеринг представления, предоставляя производным данным, которые необходимы для правильного вызова какого-либо объекта для создания экземпляра. Более длительное обсуждение со ссылками на этот

MVC2 Modelbinder for List of derived objects

 Смежные вопросы

  • Нет связанных вопросов^_^