Liaison DropDownList à partir de la base de données
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
Donc, vous enregistrez les valeurs dans la SelectedDepartment
propriété et accédez à la Departments
liste. Ce qui n'est jamais initialisé, il le serait évidemment null
.
Modifiez votre GetBudgetsActuals
mé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 foreach
boucle. 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.
}