IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET MVC Discussion :

NullReferenceException dans le fichier cshtml Edit [Débutant]


Sujet :

ASP.NET MVC

  1. #1
    Membre actif Avatar de janyoura
    Femme Profil pro
    étudiante ingénierie informatique
    Inscrit en
    Mars 2012
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante ingénierie informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 365
    Points : 279
    Points
    279
    Par défaut NullReferenceException dans le fichier cshtml Edit
    Bonjour,
    Je suis entrain de suivre le tutoriel: http://www.asp.net/mvc/tutorials/get...vc-application
    et la je me suis trouvé face à un problème dont je n'ai pas su résoudre, pourtant ça me parait que j'ai écris exactement comme le tutoriel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    @model association.Models.reunion
     
    @{
        ViewBag.Title = "Edit";
    }
     
    <h2>Edit</h2>
     
    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
     
    @using (Html.BeginForm())
    {
        @Html.ValidationSummary(true)
        <fieldset>
            <legend>reunion</legend>
     
            @Html.HiddenFor(model => model.reunionID)
     
            <div class="editor-label">
                @Html.LabelFor(model => model.sujet)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.sujet)
                @Html.ValidationMessageFor(model => model.sujet)
            </div>
     
            <div class="editor-label">
                @Html.LabelFor(model => model.pv)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.pv)
                @Html.ValidationMessageFor(model => model.pv)
            </div>
     
            <div class="editor-label">
                @Html.LabelFor(model => model.datereunion)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.datereunion)
                @Html.ValidationMessageFor(model => model.datereunion)
            </div>
                <div class="editor-field">
             <table>
            <tr>
                @{
                    int cnt = 0;
                  List<association.ViewModels.CreateAssignedMemberData> membres = ViewBag.membres;
     
                    foreach (var membre in membres) {
                        if (cnt++ % 3 == 0) {
                            @:  </tr><tr> 
                        }
                        @: <td> 
                            <input type="checkbox" 
                                   name="selectedCourses" 
                                   value="@membre.PersonneID" 
                                   @(Html.Raw(membre.Assigned ? "checked=\"checked\"" : "")) /> 
                            @membre.PersonneID @:  @membre.Nom
                        @:</td>
                    }
                    @: </tr>
                }
        </table>
    </div>
     
            <p>
                <input type="submit" value="Save" />
            </p>
        </fieldset>
    }
     
    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>
    L'erreur NullReferenceException est signalé au niveau du "foreach (var membre in membres)".
    Nb: la classe "membre" hérite de la classe "personne"

    La classe CreateAssignedMemberData se trouve sous un dossier appelé "ViewModels" et contient ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ComponentModel.DataAnnotations;
     
     
    namespace association.ViewModels
    {
        public class CreateAssignedMemberData
        {
            public int PersonneID { get; set; }
            public string Nom { get; set; }
            public string Prenom { get; set; }
            public bool Assigned { get; set; }
        }
    }
    classe reunion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ComponentModel.DataAnnotations;
     
    namespace association.Models
    {
        public class reunion
        {
            public int reunionID { set; get; }
            public string sujet { set; get; }
            public string pv { set; get; }
            [DisplayFormat(DataFormatString = "{0:d}")]
            public DateTime datereunion { set; get; }
            public virtual ICollection<membre> membres { get; set; }
     
        }
    }
    Classe membre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using association.Models;
    using System.ComponentModel.DataAnnotations;
     
    namespace association.Models
    {
        public class membre : personne
        {
     
            public DateTime dateinscription { get; set; }
     
            public virtual profil profil { get; set; }
            public virtual ICollection<reunion> reunions { get; set; }
     
        }
     
    }
    Pouvez vous m'aidez? merci
    "Scientists dream about doing great things. Engineers do them.”

    La réussite après tant de travail est un sentiment à vivre

    Si ton message est résolu, il y a un bouton qui est fait pour ça :
    Il se trouve tout en bas de la conversation !

    N'oublie pas que si ce message t'as aidé, tu peux voter pour lui en utilisant

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2013
    Messages : 76
    Points : 143
    Points
    143
    Par défaut
    Dans ta méthode Edit, tu récupère bien les membres de ta réunion?
    Ne pas le faire peut te poser problème si la lazyloading est désactiver.

    Au niveau de la récupération tu aurais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var reunion = db.Reunions.Include(r=>r.membres ).Single(r=>r.reunionID == id);
    En faisant comme ça, tu récupère ta réunion et ses membres en une seul requête SQL.

  3. #3
    Membre actif Avatar de janyoura
    Femme Profil pro
    étudiante ingénierie informatique
    Inscrit en
    Mars 2012
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante ingénierie informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 365
    Points : 279
    Points
    279
    Par défaut
    Citation Envoyé par g.Arnaud Voir le message
    Dans ta méthode Edit, tu récupère bien les membres de ta réunion?
    Ne pas le faire peut te poser problème si la lazyloading est désactiver.

    Au niveau de la récupération tu aurais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var reunion = db.Reunions.Include(r=>r.membres ).Single(r=>r.reunionID == id);
    En faisant comme ça, tu récupère ta réunion et ses membres en une seul requête SQL.
    Non je n'arrive pas à récupérer j'ai l'erreur NullReferenceException
    voila les méthodes edit dans reunionController
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
      public ActionResult Edit(int id)
            {
                reunion reunion = db.reunions
     
             .Include(i => i.membres)
             .Where(i => i.reunionID == id)
             .Single();
                return View(reunion);
            }
            private void PopulateAssignedCourseData(reunion reunion)
            {
                var allMembers = db.membres;
                var reunionMembre = new HashSet<int>(reunion.membres.Select(c => c.PersonneID));
                var viewModel = new List<AssignedMembreData>();
                foreach (var membre in allMembers)
                {
                    viewModel.Add(new AssignedMembreData
                    {
                        PersonneID = membre.PersonneID,
                        Nom = membre.nom,
                        Prenom = membre.prenom,
                        Assigned = reunionMembre.Contains(membre.PersonneID)
                    });
                }
                ViewBag.Courses = viewModel;
            }
     
            //
            // POST: /reunion/Edit/5
     
            [HttpPost]
            public ActionResult Edit(int id, FormCollection formCollection, string[] selectedCourses)
            {
                reunion reunionToUpdate = db.reunions
     
               .Include(i => i.membres)
               .Where(i => i.reunionID == id)
               .Single();
     
                PopulateAssignedCourseData(reunionToUpdate);
                return View(reunionToUpdate);
                 }
            private void UpdatereunionMembre(string[] selectedMembre, reunion reunionToUpdate)
    {
        if (selectedMembre == null)
        {
            reunionToUpdate.membres = new List<membre>();
            return;
        }
     
        var selectedCoursesHS = new HashSet<string>(selectedMembre);
        var reunionMembres = new HashSet<int>
            (reunionToUpdate.membres.Select(c => c.PersonneID));
        foreach (var membre in db.membres)
        {
            if (selectedCoursesHS.Contains(membre.PersonneID.ToString()))
            {
                if (!reunionMembres.Contains(membre.PersonneID))
                {
                    reunionToUpdate.membres.Add(membre);
                }
            }
            else
            {
                if (reunionMembres.Contains(membre.PersonneID))
                {
                    reunionToUpdate.membres.Remove(membre);
                }
            }
        }
    }
    "Scientists dream about doing great things. Engineers do them.”

    La réussite après tant de travail est un sentiment à vivre

    Si ton message est résolu, il y a un bouton qui est fait pour ça :
    Il se trouve tout en bas de la conversation !

    N'oublie pas que si ce message t'as aidé, tu peux voter pour lui en utilisant

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2013
    Messages : 76
    Points : 143
    Points
    143
    Par défaut
    En relisant une énième fois, je me rends compte que c n'est pas les membres assignés à la réunion que tu affiches.

    dans ta vue edit tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<association.ViewModels.CreateAssignedMemberData> membres = ViewBag.membres;
    Or dans ton contrôleur, dans tes méthodes edit, tu ne renseignes pas ViewBag.membres donc l'exception est bien justifiée.

  5. #5
    Membre actif Avatar de janyoura
    Femme Profil pro
    étudiante ingénierie informatique
    Inscrit en
    Mars 2012
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante ingénierie informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 365
    Points : 279
    Points
    279
    Par défaut
    Merci beaucoup, je l'ai corrigé et j'ai renseigné membres, ainsi que j'ai modifier la méthode edit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      public ActionResult Edit(int id)
            {
                reunion reunion = db.reunions
     
             .Include(i => i.membres)
             .Where(i => i.reunionID == id)
             .Single();
                PopulateAssignedCourseData(reunion);
                return View(reunion);
            }
    Maintenant l'affichage des membres s'effectue convenable à travers l'edit mais lorsque je valide le changement, rien ne change! ça dois me mener vers l'index mais ce n'est pas le cas, ça reste dans la page edit et meme au niveau de la base de données rien n'a changé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
      </div>
                <div class="editor-field">
             <table>
            <tr>
                @{
                    int cnt = 0;
                    List<association.ViewModels.AssignedMembreData> membres = ViewBag.membres;
     
                    foreach (var membre in membres) {
                        if (cnt++ % 3 == 0) {
                            @:  </tr> <tr> 
                        }
                        @: <td> 
                            <input type="checkbox" 
                                   name="selectedCourses" 
                                   value="@membre.PersonneID" 
                                   @(Html.Raw(membre.Assigned ? "checked=\"checked\"" : "")) /> 
                            @membre.PersonneID @:  @membre.Nom
                        @:</td>
                    }
                    @: </tr>
                }
        </table>
    </div>
     
            <p>
                <input type="submit" value="Save" />
            </p>
        </fieldset>
    }
     
    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>
    Nb: <tr> est souligné en vert indiquant que le texte n'est pas autorisé entre la balise d'ouverture et fermeture tr
    "Scientists dream about doing great things. Engineers do them.”

    La réussite après tant de travail est un sentiment à vivre

    Si ton message est résolu, il y a un bouton qui est fait pour ça :
    Il se trouve tout en bas de la conversation !

    N'oublie pas que si ce message t'as aidé, tu peux voter pour lui en utilisant

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2013
    Messages : 76
    Points : 143
    Points
    143
    Par défaut
    Ce que tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
            //
            // POST: /reunion/Edit/5
     
            [HttpPost]
            public ActionResult Edit(int id, FormCollection formCollection, string[] selectedCourses)
            {
                reunion reunionToUpdate = db.reunions
     
               .Include(i => i.membres)
               .Where(i => i.reunionID == id)
               .Single();
     
                PopulateAssignedCourseData(reunionToUpdate);
                return View(reunionToUpdate);
                 }
    à aucun moment, tu ne fais de redirection vers l'index

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return View(reunionToUpdate);
    ré-affiche le formulaire d'édition.

    Il faut rediriger vers l'index, si tu n'as pas eu de soucis lors de la mise à jour

    Si il n'y a pas d'erreur dans le formulaire et que tu veux bien rediriger vers l'index, tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return RedirectToAction("Index");
    Si c'est bien vers l'action index du contrôleur courant que tu veut rediriger. Sinon, tu met le nom de contrôleur en second paramètre lors de l'appel à la méthode RedirectToAction.

  7. #7
    Membre actif Avatar de janyoura
    Femme Profil pro
    étudiante ingénierie informatique
    Inscrit en
    Mars 2012
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante ingénierie informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 365
    Points : 279
    Points
    279
    Par défaut
    Merci je me suis rendu compte des fautes et j'ai corrigé le problème
    "Scientists dream about doing great things. Engineers do them.”

    La réussite après tant de travail est un sentiment à vivre

    Si ton message est résolu, il y a un bouton qui est fait pour ça :
    Il se trouve tout en bas de la conversation !

    N'oublie pas que si ce message t'as aidé, tu peux voter pour lui en utilisant

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Edition en php dans un fichier xml
    Par pierre24 dans le forum Langage
    Réponses: 23
    Dernier message: 19/02/2008, 09h59
  2. Editer une page dans un fichier texte
    Par SINASOFT dans le forum AIX
    Réponses: 6
    Dernier message: 14/01/2008, 12h01
  3. Enregistret le contenu d'un edit dans un fichier text
    Par prison_break dans le forum C++Builder
    Réponses: 19
    Dernier message: 02/01/2007, 14h55
  4. [FPDF] Edition de listings dans un fichier PDF en PHP ?
    Par nerick dans le forum Bibliothèques et frameworks
    Réponses: 16
    Dernier message: 22/03/2006, 10h53
  5. Réponses: 7
    Dernier message: 25/01/2006, 22h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo