多选列表框asp mvc

时间:2012-08-23 14:05:20

标签: c# asp.net asp.net-mvc asp.net-mvc-3 entity-framework

我正在开发一个mvc .net web应用程序,我正在使用Entity Framework。 在我的模型中,我有一个名为“utisateur”(用户)的实体,每个用户都有一个或多个监督他的用户。我想要做的是生成一个多选列表框,其中包含所有用户的列表,以便选择新用户的主管。

我试过这个但是我收到了这个错误: 对象引用未设置为对象的实例。

这是我的模特课:

public class util 
{
    public util()
    {
        user = new utilisateur();
        listesups = Getutilisateurs(null);
    }
    public utilisateur user { get; set; }
    public int[] selectedusers;
    public MultiSelectList listesups { get; set; }       
    public MultiSelectList Getutilisateurs(int[] selectedValues)
    {
        var db = new BDGestionEntities();
        List<utilisateur> utilisateurs = db.utilisateurs.ToList();
        return new MultiSelectList(utilisateurs, "id", "login", selectedValues);
    }
}

以下是包含列表框的视图部分:

 @Html.ListBoxFor(model => model.selectedusers, Model.listesups)

这是控制器

    public ActionResult Create2()
    {
        return View();
    }

[HttpPost]
    public ActionResult Create2(util model)
    {
        utilisateur u = new utilisateur();
        if (model.selectedusers != null)
        {
            foreach (var selecteduse in model.selectedusers)
            {
                int selecteduseId = selecteduse;
                utilisateur utilisateur = db.utilisateurs.Where(c => c.id == selecteduseId).FirstOrDefault();
                u.superieur.Add(utilisateur);
            }


        }
        u.nom = model.user.nom;
        u.prenom = model.user.prenom;
        u.solde_conge = model.user.solde_conge;
        u.email = model.user.email;
        u.login = model.user.login;
        u.pwd = model.user.pwd;
        role role = new role();
        //role.nom_role = model.nom_role;

        role = db.roles.Where(c => c.nom_role == model.nom_role).FirstOrDefault();
        u.role = role;
        db.utilisateurs.AddObject(u);
        db.SaveChanges();
        ViewBag.id_role = new SelectList(db.roles, "id", "nom_role", model.user.id_role);
        return RedirectToAction("index");

    }

这是错误消息

Server Error in '/' Application.
Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 
Line 44:         <tr><td><label><b>Role : </b></label></td><td>@Html.DropDownListFor(model => model.nom_role, values)</td></tr>
Line 45:         <tr>
Line 46:       <td><label><b>Liste des supérieurs : </b></label></td><td>@Html.ListBoxFor(model => model.selectedusers, Model.listesups)</td></tr>
Line 47:         </table>
Line 48:         <p>

1 个答案:

答案 0 :(得分:1)

我通过编辑我的Create2()方法解决了这个问题:

public ActionResult Create2()
    {
        string login = User.Identity.Name;
        utilisateur ut = new utilisateur();
        var q = from j in db.utilisateurs where j.login == login select j;
        foreach (var i in q)
            ut = i;
        if ((ut.role.nom_role == "Stagiaire") || (ut.role.nom_role == "Developpeur"))
            return Redirect("~/Erreur");
        util u = new util();
        u.listesups = new MultiSelectList (db.utilisateurs, "id", "login");
        return View(u);
    }

[HttpPost]
    public ActionResult Create2(FormCollection collection, util model)
    {


        var sups = collection["selectedusers"];
        string login = User.Identity.Name;
        utilisateur u = new utilisateur();
        List<int> nums = new List<int>();
        var q = from j in db.utilisateurs where j.login == login select j;
        utilisateur courant = new utilisateur();
        try
        {
            foreach (var i in q)
            {
                courant = i;
            }
            foreach (var s in sups.Split(','))
            {
                nums.Add(int.Parse(s));
            }
        }
        catch(Exception ex)
        {
            Logger.Warning(ex.Message, "aucun superieur selectionné");
        }
        try
        {
            foreach (var selecteduse in nums)
            {
                utilisateur utilisateur = db.utilisateurs.Where(c => c.id == (int)selecteduse).FirstOrDefault();
                u.superieur.Add(utilisateur);
            }
        }
        catch(Exception ex)
        {
            Logger.Error(ex.Message, "Erreur ajout supérieurs");
        }
        //}
        if ((model.user.nom != null) && (model.user.prenom != null) && (model.user.login != null) && (model.user.email != null))
        {
            u.nom = model.user.nom;
            u.prenom = model.user.prenom;
            u.solde_conge = model.user.solde_conge;
            u.email = model.user.email;
            u.login = model.user.login;
            u.pwd = model.user.pwd;
            role role = new role();
            role = db.roles.Where(c => c.nom_role == model.nom_role).FirstOrDefault();
            u.role = role;
            try
            {
                db.utilisateurs.AddObject(u);
                db.SaveChanges();
            }
            catch (Exception ex)
            {
                Logger.Error(ex.Message, "");
            }

                ViewBag.id_role = new SelectList(db.roles, "id", "nom_role", model.user.id_role);
            return RedirectToAction("index");
        }