Remplir DropDownList dans ASP.NET MVC de table de base de données à l'aide de Entity Framework 6 et ViewModel
J'ai été de me gratter la tête pendant toute une nuit sur un problème je peux le faire rapidement en utilisant ajax/jquery et des procédures stockées. Je veux
1) Remplir une liste déroulante de valeurs obtenues à partir d'une table de base de données à l'aide de Entity Framework et le modèle de vue. JE NE VEUX PAS UTILISER VIEWBAG OU VIEWDATA. Toute aide appréciée.
2) Comment puis-je créer un Créer la Vue en utilisant le Modèle de Vue avec la tous les champs par défaut ? Les échafaudages fonctionne sur un modèle, mais pas sur un modèle de vue ?
MES MODÈLES
public class Employee
{
public int EmployeeID { get; set; }
public string Name { get; set; }
public string Gender { get; set; }
public string City { get; set; }
public string Level { get; set; }
public int DepartmentId { get; set; }
}
public class Grade
{
public int ID { get; set; }
public string Level { get; set; }
}
Modèle De Vue
public class GradeSelectListViewModel
{
public Employee Employee { get; set; }
public IEnumerable<SelectListItem> Grades { get; set; }
public GradeSelectListViewModel(Employee employee, IEnumerable grades)
{
Employee = employee;
Grades = new SelectList(grades, "Grade", "Name", employee.Level);
}
}
MA CLASSE DE CONTEXTE
public class EmployeeContext : DbContext
{
public DbSet<Employee> Employees { get; set; }
public DbSet<Department> Departments { get; set; }
public DbSet<Grade> Grades { get; set; }
}
MON CONTRÔLEUR
public ActionResult Edit (int? id)
{
using (var db = new EmployeeContext())
{
var model = new GradeSelectListViewModel(db.Employees.Find(id), db.Grades);
//model.Employee = db.Employees.Single(x => x.EmployeeID == id);
model.Grades = db.Grades.ToList().Select(x => new SelectListItem
{
Value = x.ID.ToString(),
Text = x.Level
});
return View(model);
}
}
MON RASOIR PAGE CSHTML
@model MVCDemo.ViewModels.GradeSelectListViewModel
....
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
....
@Html.DropDownListFor(x => Model.Employee.Level,
new SelectList(Model.Grades, "ID", "Level"),
"Select Level")
....
<input type="submit" value="Create" class="btn btn-default" />
}
- Son juste
@Html.DropDownListFor(x => Model.Employee.Level, Model.Grades, "Select Level")
. Mais il y a d'autres problèmes avec votre code. Un modèle d'affichage ne doit pas contenir un modèle de données. Vous devez supprimer le constructeur dansGradeSelectListViewModel
(ou ajouter un constructeur sans paramètre). Vous n'avez pas besoin.ToList()
dansdb.Grades.ToList()....
- Merci Stephen. J'ai fait les modifications demandées. Je suis nulle de référence sur dropdownlist quand je fais les Employés/Créer : Système.NullReferenceException: Ligne 16 : <div class=" ="form-group"> Ligne 17 : <div class="col-md-offset-2 col-md-10"> Ligne 18 : @Html.DropDownListFor( Ligne 19 : x => le Modèle.De l'employé.Niveau, Ligne 20 : Modèle.Les notes,
- Quels sont les détails du message? Votre code vous montre remplir
model.Grades
de sorte qu'il ne peut pas êtrenull
si vous avez retourné le modèle de la vue - La méthode que vous avez indiqué est
Edit()
- mais que l'erreur se rapporte à une méthode nomméeCreate()
🙂 - Oui, l'action est d'Éditer, désolé. Près de l'obtenir. Maintenant il dit . L'opération ne peut pas être réalisée car le DbContext il a été disposé, quand je fais des Employés/Modifier/1 . L'employé avec l'id 1 existe déjà.
- C'est parce que vous l'affectant dans l'un
using
déclaration. Si vous voulez que puis utilisezmodel.Grades = db.Grades..Select(...).AsEnumerable();
- Merci Stephen ! elle fonctionne. J'aime disposer de ma connexion, mais ici, j'ai eu à le faire comme ça. A obtenu le même problème avec AsEnumerable. Il l'a fait comme ça public ActionResult Modifier (int? id) { var db = new EmployeeContext(); var modele = new GradeSelectListViewModel(); model.Nuances = db.Grades.Sélectionnez(x => nouvelle SelectListItem { Valeur = x.ID.ToString(), Text = x.Niveau }); return View(modèle); }
- Comment peut-on marquer votre réponse comme correcte ?
- Oui, c'est le meilleur moyen. Peu occupée en ce moment, mais je vais ajouter une réponse en une heure environ, avec quelques autres notes
Vous devez vous connecter pour publier un commentaire.
Le principal problème est que, dans la vue que vous avez
new SelectList(Model.Grades, "ID", "Level")
maisGrades
estIEnumerable<SelectListItem>
etSelectListItem
ne contient pas de propriétés nomméID
etLevel
.Cependant, il existe quelques autres problèmes avec votre code. D'abord un modèle d'affichage ne doit pas contenir un modèle de données, et au lieu de votre modèle de vue doit être
et ajouter de l'affichage et de la validation des attributs tel que requis. Notez que j'ai supprimé le constructeur (vous ne semblez pas à l'utiliser, mais si vous l'avez fait, alors vous devez également inclure un paramètre moins de constructeur, sinon une exception sera levée lors de la présentation de la méthode POST. J'ai aussi supposer que
Level
devrait être typeofint
puisque vous liant à laint ID
propriété deGrade
.Le code dans votre méthode GET doit être
et dans la vue
Note également que, dans la méthode POST, votre besoin de réaffecter les
SelectList
si vous retournez la vue carModelState
est pas valide.Vous pouvez utiliser l'approche suivante qui remplit trois DropDownListFor à le même point de Vue:
ViewModel:
Contrôleur:
Vue:
Espère que cela aide...