Domanda

Ho pubblicato lo sfondo su questa domanda qualche giorno fa .. ma la risposta è ancora incompleta, quindi ripubblicando con un riepilogo.

Sto sviluppando un'app Web MVC 3 Razor, in cui sono archiviati i dettagli di più categorie di oggetti. (Veicoli, case, strumenti ecc.). Tutti gli oggetti condividono alcuni dati comuni (titolo, descrizione ecc.) E alcuni dettagli specifici della categoria a cui appartiene. L'elenco delle categorie dovrebbe crescere e in vista della riduzione della manutenibilità speriamo di riutilizzare la stessa procedura guidata Aggiungi oggetto. La procedura guidata si basa sulla seguente implementazione.

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

Nel processo di procedura guidata a più fasi, il passaggio finale consente all'utente di inserire i dettagli specifici della categoria (modello, make, VIN ecc. Per un veicolo). La pagina Visualizza è legata al modello "AssetView", definito come segue

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

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

    public SpecificAsset AssetDetails { get; set; }
}

La proprietà AssetDetails verrà modificata dinamicamente in fase di esecuzione in base al tipo di categoria selezionata in una fase precedente. La vista sembra così

@model AssetView
....
<div class="wizard-step">
  ...
 </div>
<div class="wizard-step">
  ...
 </div>
<div class="wizard-step">
  @Html.EditorFor(model => model.AssetDetails)
 </div>

Nel controller, in base alla selezione della categoria. Intizializza le risorse come segue

_thisAsset.AssetDetails = new MotorAsset();

Quindi prevalere sulle viste con modelli di editor specifici del tipo.

La procedura guidata funziona bene, ma nel passaggio di salvataggio nel controller la proprietà "AssetDetails" non ha valori e viene mostrato di essere di tipo "Specificasset" che è il tipo di base. Non sono in grado di lanciarlo anche nel tipo specifico. Tuttavia, il formScollection mostra tutti i valori, le proprietà specifiche "AssetDetails" come "trasmissione", "make" sono nella raccolta dei moduli prefissata da "AssetDetails_".

Tenendo presente che ho bisogno di gestire oltre 20 tipi di categorie specifiche (motori, casa ecc.) Al passo di salvataggio del controller, come posso farlo senza un qualche tipo di hack?

È stato utile?

Soluzione

Se conosci il tipo di AssetDetails, potresti farlo in questo modo:

  1. Prendi AssetView come parametro all'azione (lega le proprietà comuni)
  2. Crea una nuova istanza degli AssetDetails specifici (ad esempio CardEtails)
  3. Utilizzare uno dei sovraccarichi di TryUpDateModel per legare i valori. Ci sono alcuni sovraccarichi che ti consentono di specificare il prefisso, quindi dovrebbe sempre funzionare
  4. Aggiungi questo oggetto a AssetView.Specificasset

Hai bisogno di un modo per conoscere il tipo specifico. Ma immagino che avresti una variabile che tiene traccia del tipo in modo da poterlo salvare correttamente più tardi comunque. Se non lo fai sarebbe facile aggiungere. Ricorda che deve essere AssetView poiché le risorse non sono vincolate.

Se hai bisogno di convalida, c'è anche un TryvalidateModel che potresti provare.

Altri suggerimenti

Come ho capito, il numero di modelli crescerà e vuoi riutilizzare l'azione e visualizzare tutti i modelli. Un'opzione che vedo è quella di realizzare un modello personalizzato. Esamineresti FormCollection e si crea un modello di risorse specifico.

Il problema con la soluzione è che Speci SpecificaSet non ha proprietà, quindi il legante del modello predefinito non lega nessuno dei campi.

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