2013-01-22 13 views
8

Prawdopodobnie prosta, ale wydaje mi się, że czegoś brakuje.Lista rozwijana lepiej jako ViewBag lub część modelu C#/.NET MVC4

dwa modele:

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

Kiedy idę do Hardware Tworzenie widoku, chcę, aby móc wybrać z listy rozwijanej Producentów, a gdy podnosi ona powinna ustanowić zależność między kawałku sprzęt i wybierz producenta.

Obecnie używam następujących zbudować selectList w kontrolerze

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

A potem rzucając go w widoku:

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

Jednak wydaje się, że powinien być lepszy sposób to zrobić - być może tworzenie viewModel, który dziedziczy z Hardware z właściwością typ SelectList?

+1

uwzględniając widok modelu dziedziczyć od podmiotu Entity Framework byłoby naprawdę zły pomysł. Powinieneś dążyć do całkowitego odizolowania swoich poglądów od swoich podmiotów. Na początku może to być więcej pracy, ale gdy już dostaniesz wzór, będziesz naprawdę zadowolony, że to zrobiłeś. – Dismissile

Odpowiedz

17

Gdy twoja aplikacja staje się coraz bardziej skomplikowana, zobaczysz, że twoja aplikacja MVC zamienia się w M-VM-V-C, VM to dedykowane ViewModels, które zwykle dodaje wszystkie rzeczy potrzebne twojej warstwie interfejsu do wygenerowania interfejsu użytkownika.

Ja osobiście nie pójdę z dziedziczeniem w tym przypadku, ponieważ Twój ViewModel nie jest wyspecjalizowaną wersją Twojego Modelu. To właśnie twój interfejs musi stworzyć widok (to naprawdę zależy od ciebie).

My ViewModel będzie wyglądać mniej więcej tak:

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

w Widoku:

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

kontroler:

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

+1 za "przekształcenie w M-VM-V-C" :) –

+2

+1 dla kompozycji> Dziedziczenie –

+1

+1 bardzo dobrze postawione! –

Powiązane problemy