2012-05-04 7 views
6

Hola a todos tengo una clase base llamada Vehículo y tengo todas las propiedades comunes a todos los vehículos allí y tengo varias clases derivadas llamados coches, jeep, que se derivan de vehículo y añadir más propiedadesASP.NET MVC 3.0 ¿Enlace de modelo con clases base y derivadas?

Ex:

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


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

tengo una clase de página en la que tengo una lista de vehículos como éste

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

mi opinión es fuertemente tipos a la clase de página por lo que en mi opinión estoy bucle sobre todos los vehículos para mostrar en la página así, este código está dentro @using (Html.BeginForm()) así que después de vuelta selecciones del usuario

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

estoy usando un editor de plantillas para cada tipo de vehículo por lo que el VehicleConstants.GetTemplateName llamada a la función simplemente devuelve el nombre de la plantilla a utilizar en función del tipo de vehículo

Esta plantilla simplemente escribe las propiedades de la clase de coche o una clase de Jeep (clase derivada + clase Base)

el problema que estoy teniendo es cuando el formulario se publicado solo puedo acceder a las propiedades de la Clase Base Vehículo en mi controlador No puedo obtener el valor de las propiedades de auto clase o Jeep.

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

¿Cuál es la mejor forma de obtener estos valores cuando se envía el formulario de regreso?

¿Crear Custom Binder Class es mi única opción? ¿Es así alguien puede proporcionarme algún código de muestra sobre cómo hacer esto? Cualquier ayuda muy apreciada.

Respuesta

6

Deberá usar una carpeta de modelo personalizada para esto. La carpeta de modelo predeterminada no sabe qué tipo de hormigón crear. Puede incluir un campo oculto dentro de cada fila que indique el tipo concreto que crearía su encuadernador de modelo personalizado. Tengo shown this in action here. Por cierto, tenga en cuenta que al utilizar la convención de nomenclatura de plantillas estándar puede deshacerse del bucle for que está utilizando, así como del método VehicleConstants.GetTemplateName.

Cuestiones relacionadas