3

私はmvc.netWebアプリケーションに取り組んでおり、EntityFrameworkを使用しています。私のモデルでは、「utisateur」(ユーザー)と呼ばれるエンティティがあり、すべてのユーザーには、彼を監督する1人以上のユーザーがいます。私がやりたいのは、新しいユーザーのスーパーバイザーを選択するために、すべてのユーザーのリストを含む複数選択リストボックスを生成することです。

私はそれを試みましたが、このエラーが発生しました:オブジェクト参照がオブジェクトのインスタンスに設定されていません。

これが私のモデルクラスです:

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>
4

1 に答える 1

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");
        }
于 2012-09-03T17:18:28.513 に答える