Pregunta

Estoy desarrollando una aplicación web MVC 3 Razor, en la que se almacenan los detalles de múltiples categorías de objetos. (Vehículos, casas, instrumentos, etc.). Todos los objetos comparten algunos datos comunes (título, descripción, etc.) y algunos detalles específicos de la categoría en la que pertenece. Se espera que la lista de categorías crezca y, en vista de reducir la mantenimiento, esperamos reutilizar el mismo asistente de objetos. El asistente se basa en la siguiente implementación.

http://afana.me/post/create-wizard-in-aspnet-mvc-3.aspx

En el proceso de asistente de múltiples pasos, el paso final permite al usuario ingresar los detalles específicos de la categoría (modelo, marca, vin, etc. para un vehículo). Actualmente he imaginado este paso final como una vista parcial con AJAX. Por lo tanto, tendremos vistas parciales de Mulltiple que reflejan la categoría específica, pero comparten el resto del código del asistente.

Mi objeto de modelo genérico es así

public class AssetView
{
    [Required]      
    public string Title
     {
        get;
        set;
     }

    [Required]
    public string Description
    {
     get;
      set;
     }

    // Few more generic fields here

    public SpecificAsset AssetDetails { get; set; }
}

La compleja propiedad de las colas de activo está representada por cada tipo de vista parcial. Por lo tanto, el "Motordetails" parcialview contendrá un modelo de tipo de motor de tipo fuertemente escrito que se declara a continuación.

  public class MotorAsset : SpecificAsset
    {
        [Required]
        public string Transmission
        {
            get;
            set;
        }

        [Required]
        public string Make
        {
            get;
            set;
        }
     }

La validación real es mucho compleja, pero los he omitido, por lo que es más fácil de entender.

La página principal del asistente se declara como

    @model AssetView

  .....

  <div class="wizard-step">
     ....
  </div>
  <div class="wizard-step">
     ....
  </div>
  <div class="wizard-step">
      @{Html.RenderPartial("_MotorCreate", Model.AssetDetails);
  </div>

La vista parcial del motor como

 @model MotorAsset

Mi pregunta es cómo puedo lograr la validación del modelo en este escenario (o es posible usar), ya que el paso final no está en la página de vista sino en una vista parcial.

¿Fue útil?

Solución

¿Por qué no recurriría a la herencia de clases simples (paradigma OOP) en lugar de tener una propiedad de la propiedad en su activo?

En lugar de lo que ahora tienes, debes declarar el

AssetView (propiedades genéricas) -> MotorView heredando AssetView (propiedades específicas)

Como esto:

public class AssetView {     
    [Required]           
    public string Title { get; set; }

    [Required]
    public string Description     { get; set; }      

    // Few more generic fields here
}

public class MotorView : AssetView {
    ...
}

@model MotorView    // you still have access to the AssetView's properties in your view and in your controller actions

Si quieres dejarlo como lo tienes ahora, usa EditorFor() y crear un EditorFor plantilla en la carpeta compartida y escribirla MotorAsset (o SpecificAsset, si lo quieres aún más genérico).

Luego lo arriesgue así:

@Html.EditorFor(model=>model.AssetDetails)

Esto permitirá que el controlador lo valide y lo envuelva a la propiedad en su AssetView. Hth

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top