Liaison DropDownList à partir de la base de données

Nov 24 2020

Je suis en train de créer une vue qui affichera des données tabulaires en fonction des sélections de deux listes déroulantes, la première qui sélectionne les services est remplie à partir de la base de données. Le second est une liste déroulante statique pour "Année" que je n'ai pas encore eu. Il y a des réponses à des questions similaires, mais je les ai regardées et j'ai tout essayé. Je suis arrivé au point où j'obtiens une exception nulle dans la vue où j'ai créé le balisage pour la liste déroulante.

Vue:

Les départements reviennent comme null. Je suis nouveau sur MVC et je l'ai reconstitué à partir d' exemples en ligne . Je suppose que mon modèle est faux.

@model IEnumerable<BudgetDemo.Models.BudgetsActualsViewModel>

@foreach (var item in Model)
{
    @Html.DropDownListFor(m => item.Departments, 
        new SelectList(item.Departments.Select(x => x.Text)))
}

VoirModèle:

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

Manette:

public ActionResult GetBudgetsActuals()   
{
    repo = new BudgetDemoRepository();
    ModelState.Clear();
    return View(repo.GetBudgetsActuals());
}

Classe de référentiel:

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

Réponses

1 JamshaidK. Nov 24 2020 at 06:13

Donc, vous enregistrez les valeurs dans la SelectedDepartmentpropriété et accédez à la Departmentsliste. Ce qui n'est jamais initialisé, il le serait évidemment null.

Modifiez votre GetBudgetsActualsméthode comme ceci:

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

Et voici à quoi devrait ressembler votre vue:

@model BudgetDemo.Models.BudgetsActualsViewModel
@Html.DropDownListFor(m => m.SelectedDepartment, Model.Departments))

Remarquez, nous nous sommes débarrassés de la foreachboucle. Nous avons besoin que la DropDownListFor()méthode ne soit appelée qu'une seule fois.


METTRE À JOUR

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