2013-01-22 6 views
8

Probabilmente semplice, ma mi sembra che manchi qualcosa.Elenco a discesa migliore come ViewBag o parte del modello C# /. NET MVC4

due modelli:

public class Hardware 
{ 
    [Required] 
    public int Id { get; set; } 

    public int SerialNum { get; set; } 
    public int ProductNum { get; set; } 
    public string Notes { get; set; } 
    public DateTime PurchaseDate { get; set; } 
    public DateTime WarrantyExpiration { get; set; } 

    public virtual Manufacturer Manufacturer { get; set; } 
} 

public class Manufacturer 
{ 
    public int Id { get; set; } 

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

    public virtual ICollection<Hardware> Hardware { get; set; } 
} 

Quando vado alla Hardware Crea vista, voglio essere in grado di selezionare da un menu a discesa di costruttori, e quando a suo avviso dovrebbe stabilire una relazione tra il pezzo di hardware e il produttore selezionato.

Al momento, ho usato la seguente di costruire un SelectList nel controller

SelectList selectList = new SelectList(db.Manufacturers, "Id", "Name"); 
ViewBag.selectList = selectList; 

E poi lanciarlo nella vista:

@Html.DropDownListFor(model => model.Manufacturer, ViewBag.selectList as SelectList)\ 

Tuttavia, sembra che ci dovrebbe essere un modo migliore per farlo - magari creando un viewModel che eredita dall'hardware con una proprietà tipizzata SelectList?

+1

Avere una vista del modello ereditare da un'entità Entity Framework sarebbe una pessima idea Dovresti sforzarti di isolare completamente le tue opinioni dalle tue entità. All'inizio potrebbe essere più un lavoro, ma una volta ottenuto lo schema, sarai davvero contento di averlo fatto. – Dismissile

risposta

17

Mentre la tua applicazione diventa sempre più complicata, vedrai la tua applicazione MVC trasformarsi in M-VM-V-C, VM è dedicato a ViewModels che di solito aggiunge tutto ciò di cui il tuo livello UI necessita per generare l'interfaccia utente.

In questo caso personalmente non andrei con l'ereditarietà, perché ViewModel non è una versione specializzata del modello. È proprio ciò di cui la tua interfaccia utente ha bisogno per creare una vista (questo dipende solo da te).

mio ViewModel sarebbe simile a questa:

public class HardwareVm 
{ 
    public Hardware Hardware { get; set; } 
    public IEnumerable<SelectListItem> Manufacturers { get; set; } 
} 

in Vista:

@Html.DropDownListFor(model => model.Hardware.Manufacturer, Manufacturers) 

regolatore:

var manufacturers = db.Manufacturers.Select(m => new SelectListItem {Text = m.Name, Value = m.Id }); 
var model = new HardwareVm { Manufacturers = manufacturers }; 
+3

+1 per "trasformarsi in M-VM-V-C" :) –

+2

+1 per Composizione> Eredità –

+1

+1 molto ben inserito! –

Problemi correlati