Binden von DropDownList aus der Datenbank
Ich erstelle eine Ansicht, in der Tabellendaten basierend auf der Auswahl aus zwei Dropdown-Listen angezeigt werden. Die erste, die Abteilungen auswählt, wird aus der Datenbank ausgefüllt. Die zweite ist eine statische Dropdown-Liste für "Jahr", die ich noch nicht habe. Es gibt Antworten auf ähnliche Fragen, aber ich habe sie mir angesehen und alles versucht. Ich habe den Punkt erreicht, an dem in der Ansicht, in der ich das Markup für die Dropdown-Liste erstellt habe, eine Null-Ausnahme angezeigt wird.
Aussicht:
Abteilungen kommen als null zurück. Ich bin neu bei MVC und habe dies aus Online- Beispielen zusammengesetzt . Ich vermute, mein Modell ist falsch.
@model IEnumerable<BudgetDemo.Models.BudgetsActualsViewModel>
@foreach (var item in Model)
{
@Html.DropDownListFor(m => item.Departments,
new SelectList(item.Departments.Select(x => x.Text)))
}
ViewModel:
public class BudgetsActualsViewModel
{
[Display(Name = "Cost Center/Department")]
[Required(ErrorMessage = "Cost Center/Department is required.")]
[StringLength(62)]
public string SelectedDepartment { get; set; }
public IEnumerable<SelectListItem> Departments { get; set; }
}
Regler:
public ActionResult GetBudgetsActuals()
{
repo = new BudgetDemoRepository();
ModelState.Clear();
return View(repo.GetBudgetsActuals());
}
Repository-Klasse:
public List<BudgetsActualsViewModel> GetBudgetsActuals()
{
...
List<BudgetsActualsViewModel> budgetsActualsList = new List<BudgetsActualsViewModel>();
// Query returning correct data from DB here
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
budgetsActualsList.Add(
new BudgetsActualsViewModel
{
SelectedDepartment = ds.Tables[0].Rows[i]["Department"].ToString()
}
);
}
return budgetsActualsList;
}
Antworten
Sie speichern also die Werte in der SelectedDepartment
Eigenschaft und greifen auf die Departments
Liste zu. Was niemals initialisiert wird, so wäre es offensichtlich null
.
Ändern Sie Ihre GetBudgetsActuals
Methode wie folgt :
public BudgetsActualsViewModel GetBudgetsActuals()
{
...
BudgetsActualsViewModel budgetsActuals = new BudgetsActualsViewModel(){ Departments = new List<SelectListItem>() };
// Query returning correct data from DB here
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
budgetsActuals.Departments
.Add(new SelectListItem
{
Text = ds.Tables[0].Rows[i]["Department"].ToString(),
Value = ds.Tables[0].Rows[i]["YourRowId"].ToString()
});
}
return budgetsActuals;
}
Und so sollte Ihre Ansicht aussehen:
@model BudgetDemo.Models.BudgetsActualsViewModel
@Html.DropDownListFor(m => m.SelectedDepartment, Model.Departments))
Beachten Sie, wir haben die foreach
Schleife losgeworden . Wir brauchen eine DropDownListFor()
Methode, die nur einmal aufgerufen werden muss.
AKTUALISIEREN
public class BudgetsActualsViewModel
{
[Display(Name = "Cost Center/Department")]
[Required(ErrorMessage = "Cost Center/Department is required.")]
[StringLength(62)]
public string SelectedDepartment { get; set; }
public List<SelectListItem> Departments { get; set; } // Modify it to list instead IEnumerable.
}