Domanda

sto sviluppando un MVC 3 Razor Web App, in cui sono memorizzati i dettagli di diverse categorie di oggetti. (Veicoli, Case, strumenti, ecc). Tutti gli oggetti condividono alcuni dati comuni (titolo, descrizione, ecc) e alcuni dettagli che sono specifici per la categoria in cui essa appartiene. L'elenco delle categorie è destinato a crescere e in vista di ridurre la manutenibilità speriamo di riutilizzare la stessa procedura guidata Aggiungi oggetto. La procedura guidata si basa sul seguente implementazione.

http://afana.me/post/create- wizard-in-ASPNET-MVC-3.aspx

Nel processo di passaggio della procedura guidata multipla, il passo finale consente all'utente di inserire i dettagli categoria specifica (modello, marca, ecc VIN per un veicolo). Attualmente ho immaginato questo passaggio finale come una vista parziale con AJAX. Così saremo in realtà essere avere una vista parziale mulltiple che riflettono la categoria specifica, ma condividere il resto del codice procedura guidata.

Il mio oggetto modello generico è come questo

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

I AssetDetails immobiliari complessi è rappresentato da ciascun tipo di vista parziale. Così i PartialView "MotorDetails" conterrà un modello fortemente tipizzato di tipo MotorAsset che viene dichiarato come di seguito.

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

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

La convalida reale è di gran lunga complesso, ma ho omesso questi in modo che sia più facile da capire.

La pagina guidata principale è dichiarato come

    @model AssetView

  .....

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

Il Motor parziale Vedi come

 @model MotorAsset

La mia domanda è come posso realizzare la validazione dei modelli in questo scenario (o è possibile l'uso), come fase finale non è nella pagina di visualizzazione, ma su una visione parziale.

È stato utile?

Soluzione

Perché non ricorrere alla semplice classi eredità (paradigma OOP) piuttosto che avere un AssetDetails proprietà sulla vostra AssetView?

Al posto di quello che hai ora si dovrebbe invece dichiarare la

AssetView (proprietà generici) -> MotorView ereditare AssetView (proprietà specifiche)

In questo modo:

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

Se si vuole lasciare la strada che hai ora, quindi utilizzare EditorFor() e creare un modello di EditorFor nella cartella condivisa e forte tipo a MotorAsset (o SpecificAsset, se si vuole ancora di più generico).

Poi lo rendono come questo:

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

Ciò consentirà il controller per convalidarlo e bind automatico alla proprietà nel vostro AssetView. HTH

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