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 :

Ajouter une liste d'objet lors de la création d'un autre objet


Sujet :

ASP.NET MVC

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Django
    Inscrit en
    Novembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Django

    Informations forums :
    Inscription : Novembre 2016
    Messages : 18
    Points : 35
    Points
    35
    Par défaut Ajouter une liste d'objet lors de la création d'un autre objet
    Bonjour,

    Je me permets de venir poser ma question ici, car je pense que c'est le lieu adéquat.
    J'apprends depuis vraiment peu de temps le C# et l'environnement .NET avec ASP.NET MVC.

    Après avoir lu pas mal de cours, tutoriel et visionné des vidéos, j'essaye de mettre en application ce que j'ai retenu (pas une mince affaire )
    Je me lance dans la création d'un petit projet, mais voilà j'aborde une difficulté que je n'arrive pas à résoudre.

    Principe de mon application :

    Cette application me permet de gérer les compositions de mon équipe de football pour chaque match.

    1) La classe Joueur

    Nous avons une classe de modèle : Joueur
    Dans cette classe, chaque objet Joueur possède les propriétés suivantes : JoueurID, Firstname, Lastname, Poste et une Image
    Globalement cela correspond à renseigner la liste des licenciés de mon club de foot.

    Voilà ma classe Joueur :

    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
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Linq;
    using System.Web;
     
    namespace FCSL.Models.Joueur
    {
        public class Joueur
        {
            [Key, Display(Name = "ID")]
            public int JoueurID { get; set; }
     
            [Required, Display(Name = "Nom"), StringLength(30)]
            public string Lastname { get; set; }
     
            [Required, Display(Name = "Prénom"), StringLength(30)]
            public string Firstname { get; set; }
     
            [Required]
            [Display(Name = "Poste")]
            public string Poste { get; set; }
     
            public string Image { get; set; }
        }
    }

    2) La classe Match

    Dans cette classe, je créé un objet à chaque fois qu'un match approche avec les propriétés suivantes : MatchID, MatchDay, MatchTime, Adversaire, Format, Terrain, Tresse, Slug

    La classe `Match` donne donc :

    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
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Web.Mvc;
     
    namespace FCSL.Models.Match
    {
        public class Match
        {
            [Key]
            public int MatchID { get; set; }
     
            [Required, Display(Name = "Date du match")]
            [DataType(DataType.Date)]
            public DateTime MatchDay { get; set; }
     
            [Required, Display(Name = "Heure du match")]
            [DataType(DataType.Time)]
            [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:HH:mm}")]
            public DateTime MatchTime { get; set; }
     
            [Required, Display(Name = "Adversaire")]
            public string Adversaire { get; set; }
     
            [Required, Display(Name = "Type de match")]
            public string Format { get; set; }
     
            [Required, Display(Name = "Terrain")]
            public string Terrain { get; set; }
     
            [Display(Name = "Tresse")]
            public string Tresse { get; set; }
     
            [Required, Display(Name = "Mot-clé")]
            public string Slug
            {
                get { return Format + "_" + Adversaire + "_" + MatchDay.ToString("dd_MM_yyyy"); }
            }
        }
    }

    3) La partie délicate pour moi

    Je voudrais, lors de la création de mon match, pouvoir ajouter tous les joueurs sélectionnés pour ce match.
    Donc avoir une ICollection<Joueur.Joueur> ListeJoueurs {get; set;} je suppose dans ma classe Match.
    Par exemple avec un menu déroulant et une possibilité de faire une sélection multiple sur ma classe Joueur.

    Sauf que voilà, après avoir ajouté cette nouvelle propriété, je ne parviens pas à l'afficher correctement dans ma vue, ni même savoir comment je dois mettre cela en place dans mon controller.

    Voici à quoi ressemble ma classe MatchController :

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Entity;
    using System.Linq;
    using System.Net;
    using System.Web;
    using System.Web.Mvc;
    using FCSL.Models;
    using FCSL.Models.Match;
     
    namespace FCSL.Controllers
    {
        public class MatchesController : Controller
        {
            private FCSLContext db = new FCSLContext();
     
            // GET: Matches
            public ActionResult Index()
            {
                return View(db.Matches.ToList());
            }
     
            // GET: Matches/Details/5
            public ActionResult Details(int? id)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
                Match match = db.Matches.Find(id);
                if (match == null)
                {
                    return HttpNotFound();
                }
                return View(match);
            }
     
            // GET: Matches/Create
            public ActionResult Create()
            {
     
                var listejoueurs = db.Joueurs.Select(c => new
                {
                    JoueurName = c.Firstname
                }).ToList();
                ViewBag.Joueur = new MultiSelectList(listejoueurs, "Firstname");
     
                return View();
            }
     
            // POST: Matches/Create
            // Afin de déjouer les attaques par sur-validation, activez les propriétés spécifiques que vous voulez lier. Pour 
            // plus de détails, voir  https://go.microsoft.com/fwlink/?LinkId=317598.
            [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult Create([Bind(Include = "MatchID,MatchDay,MatchTime,Adversaire,Format,Terrain,Tresse,Slug,ListeJoueurs")] Match match)
            {
                if (ModelState.IsValid)
                {
                    db.Matches.Add(match);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
     
                return View(match);
            }
     
            // GET: Matches/Edit/5
            public ActionResult Edit(int? id)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
                Match match = db.Matches.Find(id);
                if (match == null)
                {
                    return HttpNotFound();
                }
                return View(match);
            }
     
            // POST: Matches/Edit/5
            // Afin de déjouer les attaques par sur-validation, activez les propriétés spécifiques que vous voulez lier. Pour 
            // plus de détails, voir  https://go.microsoft.com/fwlink/?LinkId=317598.
            [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult Edit([Bind(Include = "MatchID,MatchDay,MatchTime,Adversaire,Format,Terrain,Tresse,Slug,ListeJoueurs")] Match match)
            {
                if (ModelState.IsValid)
                {
                    db.Entry(match).State = EntityState.Modified;
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                return View(match);
            }
     
            // GET: Matches/Delete/5
            public ActionResult Delete(int? id)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
                Match match = db.Matches.Find(id);
                if (match == null)
                {
                    return HttpNotFound();
                }
                return View(match);
            }
     
            // POST: Matches/Delete/5
            [HttpPost, ActionName("Delete")]
            [ValidateAntiForgeryToken]
            public ActionResult DeleteConfirmed(int id)
            {
                Match match = db.Matches.Find(id);
                db.Matches.Remove(match);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
     
            protected override void Dispose(bool disposing)
            {
                if (disposing)
                {
                    db.Dispose();
                }
                base.Dispose(disposing);
            }
        }
    }
    J'ai lu qu'il fallait utiliser les ViewModels (Pourquoi ? Est-ce vrai ?) ?

    Voilà à quoi je souhaiterais que mon formulaire ressemble (avec la possibilité de choisir plusieurs joueurs dans la liste) :

    Nom : form.png
Affichages : 79
Taille : 5,1 Ko

    Merci beaucoup pour votre réponse, je suis vraiment perdu pour le coup

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur Django
    Inscrit en
    Novembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Django

    Informations forums :
    Inscription : Novembre 2016
    Messages : 18
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    Comprenant bien le fait que c'est un forum et que chacun vient ici sur ton temps libre, je voulais savoir si quelqu'un pouvait m'aiguiller un peu sur ma problématique ?
    Après avoir parcouru encore de la doc (je ne trouve pas un cours pertinent sur asp.net mvc), je vois qu'il faut effectivement que je passe vers un ViewModels car je souhaite afficher un formulaire prenant en compte les informations de mon match, mais également une liste déroulante avec choix multiple des joueurs. Donc 2 modèles différents = utilisation des ViewModels.

    Ce que j'essaye de comprendre, c'est déjà si mes 2 modèles de domaine sont bons :

    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
     
    public class Player
        {
            [Key, Display(Name = "ID")]
            public int PlayerID { get; set; }
     
            [Required, Display(Name = "Nom"), StringLength(30)]
            public string Lastname { get; set; }
     
            [Required, Display(Name = "Prénom"), StringLength(30)]
            public string Firstname { get; set; }
     
            [Required]
            [Display(Name = "Poste")]
            public string Position { get; set; }
        }
    Celui ci, je pense qu'il ne pose aucun soucis, très simple, il fonctionne parfaitement.

    Maintenant le modèle concernant mon Match :

    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
     
    public class Match
        {
            [Key]
            public int MatchID { get; set; }
     
            [Required, Display(Name = "Date du match")]
            [DataType(DataType.Date)]
            public DateTime MatchDay { get; set; }
     
            [Required, Display(Name = "Heure du match")]
            [DataType(DataType.Time)]
            [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:HH:mm}")]
            public DateTime MatchTime { get; set; }
     
            [Required, Display(Name = "Adversaire")]
            public string Adversary { get; set; }
     
            [Required, Display(Name = "Type de match")]
            public string Format { get; set; }
     
            [Required, Display(Name = "Terrain")]
            public string Pitch { get; set; }
     
            [Display(Name = "Tresse")]
            public string Tresse { get; set; }
     
            [Required, Display(Name = "Mot-clé")]
            public string Slug
            {
                get { return Format + "_" + Adversary + "_" + MatchDay.ToString("dd_MM_yyyy"); }
            }
     
            [Display(Name = "Liste des Joueurs")]
            public List<Player> PlayerList { get; set; }
        }
    Peu de difficultés, sauf pour la dernière propriétés. Si je veux avoir ma liste de joueurs, il faut bien que je rajoute cette propriété ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public List<Player> PlayerList { get; set; }
    Est ce que je dois faire apparaître une propriété Match dans ma table Player ? En sachant que la combinaison des matchs et des joueurs se fait uniquement lorsque je créé un nouvel objet Match (pour lequel je passe une liste de joueurs).

    Désormais, il faut que je passe cela à une ViewModel :

    J'ai donc créé ceci :

    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
     
    public class MatchPlayersVM
        {
            [Required, Display(Name = "Date du match")]
            [DataType(DataType.Date)]
            public DateTime MatchDay { get; set; }
     
            [Required, Display(Name = "Heure du match")]
            [DataType(DataType.Time)]
            [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:HH:mm}")]
            public DateTime MatchTime { get; set; }
     
            [Required, Display(Name = "Adversaire")]
            public string Adversary { get; set; }
     
            [Required, Display(Name = "Type de match")]
            public string Format { get; set; }
     
            [Required, Display(Name = "Terrain")]
            public string Pitch { get; set; }
     
            [Display(Name = "Tresse")]
            public string Tresse { get; set; }
     
            [Display(Name = "Liste des Joueurs")]
            public List<Player> PlayerList { get; set; }
        }
    Avant d'aller plus loin avec la partie sur mon controller, est-ce-que j'ai déjà bon avec la partie model/viewmodel ?

    D'avance merci,

Discussions similaires

  1. Réponses: 12
    Dernier message: 18/07/2018, 07h44
  2. Réponses: 0
    Dernier message: 18/04/2014, 19h02
  3. Ajout de Node a partir d'objet contenant une liste d'objet
    Par Al_Bundy dans le forum Windows Forms
    Réponses: 4
    Dernier message: 05/08/2008, 14h35
  4. Tri d'une liste d'objet CObList
    Par cjacquel dans le forum MFC
    Réponses: 1
    Dernier message: 13/07/2005, 13h50
  5. [MFC] Retourner une liste d'objets
    Par 1cado dans le forum MFC
    Réponses: 10
    Dernier message: 28/07/2003, 12h11

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