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 dans GradeSelectListViewModel (ou ajouter un constructeur sans paramètre). Vous n'avez pas besoin .ToList() dans db.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 être null 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ée Create() 🙂
  • 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 utilisez model.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