Binden von DropDownList aus der Datenbank

Nov 24 2020

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

1 JamshaidK. Nov 24 2020 at 06:13

Sie speichern also die Werte in der SelectedDepartmentEigenschaft und greifen auf die DepartmentsListe zu. Was niemals initialisiert wird, so wäre es offensichtlich null.

Ändern Sie Ihre GetBudgetsActualsMethode 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 foreachSchleife 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.
}