Domanda

Ho un semplice Poco-Modello utilizzando le classi astratte, e sembra che non funzioni con il valore di Default ModelBinder di Asp.net MVC 2.Un Elemento ha più Oggetti in un insieme, tutti con la stessa classe di base astratta.

Modello:

    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; }
    }

Esempio:

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;

Usando il valore di Default Html.EditorForModel() Helper per l'elemento, con una TextObject in Oggetti di collezione ho un html ingresso in campo così:

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

Quando postare al Controller di ottenere un "Non è possibile creare una classe astratta" Errormessage dal Default ModelBinder.Ovviamente il legante tenta di creare un'istanza di quella classe di base astratta.Ma non so perché, dato che ci sono è solo un oggetto di ereditato TextObject tipo di raccolta.C'è qualche altro modo per ottenere questo lavoro senza la scrittura di un custom Modelbinder?

È stato utile?

Soluzione

Si dovrà utilizzare un modello personalizzato raccoglitore o utilizzare ViewModel. Il modello legante conosce solo il tipo che si usa come parametro per la vostra azione (contiene la classe astratta). Poi si cerca di mappare i valori dalla richiesta a quel modello. Non c'è modo il legante poteva sapere che si deve usare qualche altra implementazione e quali implementazione che potrebbe essere.

Il mio consiglio è quello di creare ViewModels che sono più semplici e mappare utilizzando automapper .

Altri suggerimenti

Controllare il DerivedTypeModelBinder in MvcContrib.Il TypeStamping inietta metadati in vista di rendering, dando il derivedtypemodelbinder le informazioni necessarie per effettuare la chiamata corretta su ciò che per creare un'istanza di oggetto.Una lunga discussione con il link a questo

MVC2 Modelbinder per la Lista di oggetti derivati

Credo che avrete modo devono indicare nella classe Item della collezione Oggetti come ICollection<TextObject>. In caso contrario, sarebbe impossibile per il legante modello predefinito per rendersi conto quale oggetto si dovrebbe creare. Se si decide di creare un modello personalizzato legante, avrete modo bisogno di aggiungere in forma, per ogni oggetto, un campo che indica il tipo. Saluti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top