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 :

Insérer une propriété de navigation en base


Sujet :

ASP.NET MVC

  1. #1
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 101
    Points : 58
    Points
    58
    Par défaut Insérer une propriété de navigation en base
    Bonjour, je travaille sur une appli MVC3.
    Je souhaite enregistrer un objet "Equipe" qui ne contient qu'un ensemble de "Responsable" comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        public class Team
        {
            public int TeamId { get; set; }
     
            //propriétés de naviagtion
            public virtual ICollection<Responsable> Responsables { get; set; }
        }
    }
    Ensuite, dans une vue, je demande à l'utilisateur de remplir un textarea grace à JQuery. Je recupere une chaine de caractere qui contient les noms des responsables separés par un espace. Dans mon controler, je split cette chaine de caractere et je fais une recherche dans la table "Responsable" sur chaque element ainsi séparé. Ensuite je parcours le résultat de la recherche puis j'ajoute le responsable à la propriété de navigabilité de ma classe :


    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
     
    [HttpPost]
            public ActionResult CreerTeam( String listeMembres)
            {
                Team team = new Team();
                //je decoupe la string qui est la concaténation des noms des membres de l'equipe séparés chacun par un espace. De cette maniere, je me retrouve avec un espace dans le tableau, dans le dernier indice
                String[] membres = listeMembres.Split(' ');
     
                var responsables = from s in db.Responsables
                              select s;
     
                foreach (string str in membres)
                {
                         responsables = responsables.Where(d => d.Nom.ToUpper().Contains(str.ToUpper()));
     
                        if (responsables != null)
                        {
                            foreach (var resp in responsables)
                            {
                                Response.Write(responsables.Count());
                                    Response.Write(" "+resp.Nom );
                                    if (resp != null)
                                    {
                                        Response.Write("nom du responsable:" + resp.Nom + " mail: " + resp.Mail + " prenom: " + resp.Prenom);
                                        team.Responsables.Add(resp);
                                    }
                                    db.SaveChanges();
                            }
                        }
                }
     
                ViewBag.Responsables = db.Responsables.ToList();
                return View();
            }
    Le Response.Write() avant l'Add en base me renvoi bien les propriétés de l'objet, mais j'obtient une erreur lors du Add(resp):

    Object reference not set to an instance of an object.
    Donc je ne comprends pas...on ne peux pas ajouter un element à une propriété de navigation de cette manière? erreur de conception?

    Merci et bonne journée

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Points : 1 498
    Points
    1 498
    Par défaut
    Salut,

    En premier lieu: n'utilise pas à la fois response.write et une vue (cela peut peut être marcher mais c'est vraiment pas beau).

    Enfin ton bug vien d'une erruer simple, tu n'as pas céer ta collection:

    db.Responsables est null => tu dois creer ton instance avant d'ajouter des membres à ta listes ex : db.Responsables = new List<Responsable> ();

  3. #3
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Salut,
    merci pour la reponse rapide,
    Pourquoi parles-tu de db.Responsables? Je precise que j'ai instancié db plus haut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private DemandeContext db = new DemandeContext();
    je pense que db.Responsables fonctionne puisque ma liste de responsables est bien remplie dans la vue. Le probleme viendrait de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    team.Responsables.Add(resp);
    Est-ce qu'il faut instancier team.Responsables ? je ne comprends pas trop ta remarque, peux-tu m'expliquer stp?
    Merci et bonne journée

    Edit: J'ai instancier mon team.Responsables dans la classe tel que suis:
    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
     
       public class Team
        {
            public int TeamId { get; set; }
            public string nom { get; set; }
            //propriétés de navigation
            public virtual ICollection<Responsable> Responsables
            {
                get{
                    if (Responsables != null)
                    {
                        return Responsables;
                    }
                    else
                    {
                        return new List<Responsable>();
                    }
                }
                protected set{Responsables = value;}
            }
        }
    J'ai une erreur au niveau de l'accolade du get:
    {Cannot evaluate expression because the current thread is in a stack overflow state.}
    Boucle infinie? si quelqu’un a une idée

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Points : 1 498
    Points
    1 498
    Par défaut
    Re,

    Désolé de na pas avoir été clair: c'est bien ta liste de responsable qui n'est pas instanciée.

    Le plus simple et le plus sur est de faire un constructeur pour ta classe Team:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public Team()
    {
      this.Responsables = new List<Responsable>();
    }
    Et d'enlever ton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            public virtual ICollection<Responsable> Responsables
            {
                get{
                    if (Responsables != null)
                    {
                        return Responsables;
                    }
                    else
                    {
                        return new List<Responsable>();
                    }
                }
                protected set{Responsables = value;}
            }
    afin de remettre la version initiale de ta propriété:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public virtual ICollection<Responsable> Responsables { get; set; }


    Enfin le problème de stackoverflow dans ton dernier post est tu à ta propriété, en effet le get et le set bouclent sur eux-même, car tu n'as pas de champ privé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public virtual ICollection<Responsable> Responsables
            {
                get{
                    if (Responsables != null)
                    {
                        return Responsables;
                    }
                    else
                    {
                        return new List<Responsable>();
                    }
                }
                protected set{Responsables = value;}
            }
    => je pense que tu as essayé de copier-coller un bout de code sur le net sans regarder la casse, la version correcte est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            private List<string> mesString;
            public List<string> MesString
            {
                get
                {
                    if (mesString == null)
                        mesString = new List<string>();
                    return mesString;
                }
                set
                {
                    this.mesString = value;
                }
            }
    cf http://msdn.microsoft.com/fr-fr/libr...=vs.80%29.aspx

  5. #5
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Salut,

    Merci, je comprends bien mieux comme ça. C'était donc un probleme C# de débutant Ta solution marche nickel. Donc pas de probleme pour ajouter un element à une propriété de navigation,

    je précise que pour l'enregistrement, j'ai rajouté la ligne d'ajout au DbSet avant de sauvegarder:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       team.Demandes.Add(demande);
       db.SaveChanges();
    Bonne journée

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/12/2013, 00h05
  2. Insérer une image envoyée dans ma base de données
    Par scary02 dans le forum Langage
    Réponses: 11
    Dernier message: 12/07/2013, 11h41
  3. Réponses: 0
    Dernier message: 03/06/2011, 17h40
  4. [PDF] Insérer une image issue de la base de données
    Par lamiae2 dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 10/05/2009, 18h28

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