2016-07-22 18 views
0

Ich frage mich, was der allgemeine Ansatz der Übergabe einer Liste von Lookup-Werten an eine Ansicht in MVC ist. Zur Zeit habe ich 2 db Tabellen und ich benutze db erste EF6 Schnittstelle. Meine Haupttabelle hat eine Nachschlagetabelle und ich möchte eine Dropdown-Liste meiner Ansicht mit allen Werten der Suche füllen, so dass der Benutzer beim Erstellen und Editieren auswählen kann.beste Möglichkeit, Lookup-Werte an eine Dropdown-Liste zu übergeben

Mitarbeiter Tabelle

id primary key 
name varchar 
department id - this is the id of the department in the lookup 

Abteilung Tisch

id primary key 
name varchar 

Ist es am besten, eine Teil-Klasse für das Mitarbeiter-Modell zu erstellen und eine neue Eigenschaft namens allDepartments und dann in meinem Controller Aufruf eine Methode hinzufügen, dass ruft alle Abteilungen ab, bevor das Modell zur Ansicht weitergeleitet wird, oder ist es besser, die Abteilungen im viewbag/viewdata-Wörterbuch auszugeben.

Was ist der allgemeine Ansatz hier?

+0

Sie schaffen keine 'Teil' Klasse. Sie erstellen ein Ansichtsmodell - [Was ist ViewModel in MVC?] (Http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc). Und für eine typische Iplementation, beziehen Sie sich auf [diese Frage/Antwort] (http://stackoverflow.com/questions/34366305/the-viewdata-item-that-has-the-key-xxx-is-of-type-system- int32-but-muss-be-o) –

Antwort

0

Sie benötigen einen ViewModel wie diese zu erstellen:

public class EmployeeViewModel 
{ 
    public string Name { get; set; } 
    [Required(ErrorMessage = "...")] // to protect against under-posting attacks 
    [Display(Name = "Department")] 
    public int? DepartmentId { get; set; } 
    public IEnumerable<SelectListItem> Departments { get; set; } 
} 

Controller:

public ActionResult Create() 
{ 
    var employeeViewModel = new EmployeeViewModel(); 
    employeeViewModel.Departments = GetDepartments().Select(option => new SelectListItem 
    { 
     Text = option.name, 
     Value = option.Id.ToString() 
    }); 
    return View(employeeViewModel); 
} 

// Post 
public ActionResult Create(EmployeeViewModel model) 
{ 
    // Map ViewModel to Entity and Save to db... 
} 

Ausblick:

@model EmployeViewModel 

<div class="form-group"> 
    @Html.LabelFor(model => model.Name) 
    @Html.TextBoxFor(model => model.Name, new { @class = "form-control" }) 
    @Html.ValidationMessageFor(model => model.Name) 
</div> 

<div class="form-group"> 
    @Html.LabelFor(model => model.DepartmentId) 
    @Html.DropDownListFor(model => model.DepartmentId, Model.Departments, "Choose...") 
    @Html.ValidationMessageFor(model => model.DepartmentId) 
</div> 
+0

Die Leute müssen lernen, den Grund für die Abstimmung nach unten aufzuzeigen, anstatt nur darüber nachzudenken ... –

+0

Nein, das tun sie nicht. Ihre Antwort ist in Ordnung und verdient keinen Downvote, aber es enthält ein paar schlechte Praktiken (und Tippfehler, so würde es nicht funktionieren). Die Eigenschaft 'Departments' sollte' IEnumerable 'lauten und Sie erstellen die' SelectList' im Controller, nicht die View (und die View wird '@ Html.DropDownListFor (m => m.DepartmentId, Model.Departments," Choose ... "). Eigenschaft' DepartmentId' sollte 'int?' Sein (nullable) mit einem '[Required]' - Attribut. –

+0

Und die 'Selected' Eigenschaft von' SelectListItem' zu setzen ist sinnlos - sie wird von 'DropDownListFor () 'Methode (intern erstellt die Methode eine neue' SelectList' und setzt die 'Selected' Eigenschaft basierend auf dem Wert der Eigenschaft, an die Sie binden. Wenn Sie das Problem beheben, gebe ich Ihnen gerne eine Upvote. –