2012-05-04 6 views
6

Ciao a tutti ho una classe di base denominata veicolo e ho tutte le proprietà comuni a tutti i veicoli in là e non ho più classi derivate chiamati auto, jeep che derivano da veicolo e aggiungere più proprietàASP.NET MVC 3.0 Associazione del modello con classi Base e Derivate?

Es:

public class Vehicle 
{ 
    public int Color { get; set; } 
    public double Cost { get; set; } 
} 


public class Car : Vehicle 
{ 
    public SelectListItem Option { get; set; } 
} 

ho una classe pagina in cui ho una lista di veicoli del genere

public class Page 
{ 
    public List<Vehicle> vehicles { get; set; } 
} 

la mia opinione è fortemente tipi alla classe pagina in modo a mio avviso che sto loop su tutti i veicoli da mostrare a paginain questo modo, questo codice è all'interno @using (Html.BeginForm()) quindi abbiamo palo selezioni dell'utente

for(int i=0;i<Model.Vehicles.Count;i++) 
{ 
    <div id="Question"> 
     @{ 
      @Html.EditorFor(m => m.Vehicle[i], VehicleConstants.GetTemplateName(Model.Questions[i])); 
     } 
    <br /> 
    </div> 
} 

Sto usando un editor di modelli per ogni tipo di veicolo in modo che il VehicleConstants.GetTemplateName funzione di chiamata restituisce solo il nome del modello da utilizzare in base al tipo di veicolo

Questo modello scrive semplicemente le proprietà della classe auto o classe di Jeep (classe derivata + classe base)

il problema che sto avendo è quando la forma è pubblicato indietro Posso accedere solo alle proprietà di Base class Vehicle nel mio controller Non riesco a ottenere il valore per le proprietà di auto di sottoclasse o Jeep.

 [HttpPost] 
    public string ReadPost(Page page) 
    { 
    } 

Qual è il modo migliore per ottenere questi valori autobinded quando il modulo viene inviato indietro?

La creazione di Custom Binder Class è la mia unica opzione? È così possibile che qualcuno mi fornisca del codice di esempio su come farlo? Qualsiasi aiuto molto apprezzato.

risposta

6

Per questo motivo è necessario utilizzare un raccoglitore modello personalizzato. Il raccoglitore modello predefinito non conosce il tipo di calcestruzzo da istanziare. È possibile includere un campo nascosto all'interno di ciascuna riga che indica il tipo concreto che il raccoglitore modello personalizzato crea. Ho shown this in action here. Notare che, utilizzando la convenzione di denominazione dei modelli standard, è possibile eliminare il ciclo for che si sta utilizzando e il metodo VehicleConstants.GetTemplateName.

Problemi correlati