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 Discussion :

Utilisation d'une liste dans un modèle complexe


Sujet :

ASP.NET

  1. #1
    Membre averti
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Arabie Saoudite

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Janvier 2018
    Messages : 14
    Par défaut Utilisation d'une liste dans un modèle complexe
    Bonjour à tous et Joyeuses fêtes à ceux qui liront ce poste !

    Je suis sur un projet depuis plusieurs jours et impossible de trouver la solution à mon problème ... qui reste assez basique je pense

    A titre d'info et pour mieux visualiser le projet, voici sont arborescence :

    Nom : 1.PNG
Affichages : 132
Taille : 14,4 Ko

    Je dois réaliser un site Web en ASP.NET en utilisant les pages Razor. Ce site doit afficher des playlists contenant des musiques. Afin de ne pas dubliquer mes musiques en base de données, je suis parti sur un modèle "Many To Many" que voici :

    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
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Linq;
    using System.Threading.Tasks;
     
    namespace SupPlayer.Models
    {
        public class Playlists
        {
            public int ID { get; set; }
     
            [Required]
            [Display(Name = "Name")]
            public string Name { get; set; }
     
            [Required]
            [Display(Name = "Gender")]
            public string Gender { get; set; }
     
            public string Author { get; set; }
     
            public List<Musics> MusicsList { get; set; }
        }
     
        public class Musics
        {
            public int ID { get; set; }
     
            [Required]
            [Display(Name = "Name")]
            public string Name { get; set; }
     
            [Required]
            [Display(Name = "Path")]
            public string Path { get; set; }
        }
    }
    A partir de ce modèle Visual Studio me génère donc 2 tables dans une même DB ce qui est top :

    Nom : 2.PNG
Affichages : 175
Taille : 5,1 Ko

    Dans ma vue Razor j'arrive parfaitement à afficher toutes les playlists liée à un utilisateur avec une boucle . Le problème arrive quand je veux afficher une playlist plus en détail. J'aimerais pouvoir afficher toutes les musiques qui appartiennent à une Playlist. Pour cela voici ma vue Razor affichant le détail d'une musique :

    Code CSHTML : 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
    @page
    @model SupPlayer.DetailsModel
     
    @{
        ViewData["Title"] = "SupPlayer";
    }
     
    <link href="/css/site.css" rel="stylesheet" type="text/css" />
     
    <section class="backgroundDynamique">
        <h1>Details</h1>
     
        <div>
            <h4>Playlists</h4>
            <hr />
            <dl class="row">
                <dt class="col-sm-2">
                    @Html.DisplayNameFor(model => model.Playlists.Name)
                </dt>
                <dd class="col-sm-10">
                    @Html.DisplayFor(model => model.Playlists.Name)
                </dd>
                <dt class="col-sm-2">
                    @Html.DisplayNameFor(model => model.Playlists.Gender)
                </dt>
                <dd class="col-sm-10">
                    @Html.DisplayFor(model => model.Playlists.Gender)
                </dd>
            </dl>
            <table>
                @for (var i = 0; i < Model.Playlists.MusicsList.Count; i++)
                    {
                        <tr>
                            <td>
                                @Html.HiddenFor(m => Model.Playlists.MusicsList[i].Name)
                            </td>
                            <td>
                                @Html.HiddenFor(m => Model.Playlists.MusicsList[i].Path)
                            </td>
                        </tr>
                    }
            </table>
        </div>
        <div>
            <a class="linkOrange" asp-page="./Edit" asp-route-id="@Model.Playlists.ID">Edit</a> |
            <a class="linkOrange" asp-page="./Index">Back to List</a>
        </div>
    </section>

    Associé a cette vue le contrôleur permettant de lui faire parvenir les données depuis la DB :

    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
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.RazorPages;
    using Microsoft.EntityFrameworkCore;
    using SupPlayer.Data;
    using SupPlayer.Models;
     
    namespace SupPlayer
    {
        public class DetailsModel : PageModel
        {
            private readonly SupPlayer.Data.SupPlayerContext _context;
     
            public DetailsModel(SupPlayer.Data.SupPlayerContext context)
            {
                _context = context;
            }
     
            public Playlists Playlists { get; set; }
     
            public async Task<IActionResult> OnGetAsync(int? id)
            {
                if (id == null)
                {
                    return NotFound();
                }
     
                Playlists = await _context.Playlists.FirstOrDefaultAsync(m => m.ID == id);
     
                if (Playlists == null)
                {
                    return NotFound();
                }
                return Page();
            }
        }
    }
    Quand j'affiche la page détail d'une Playlist, un jolie message m'annonce que mon objet "MusicsList" n'est pas itérable ... j'en déduit que je dois mal le remplir ... ou mal l'initialiser. C'est là que je vois flou et que je n'arrive pas à comprendre mon erreur :

    Nom : 3.PNG
Affichages : 138
Taille : 41,8 Ko

    Je ne pense pas que le problème vienne d'ici, mais à titre d'information voici comment je créer mes objets "Playlists" et "Musics" dans le controlleur "Create" :

    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
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.RazorPages;
    using Microsoft.AspNetCore.Mvc.Rendering;
    using SupPlayer.Data;
    using SupPlayer.Models;
    using Microsoft.AspNetCore.Identity;
     
    namespace SupPlayer
    {
        public class CreateModel : PageModel
        {
            private readonly SupPlayer.Data.SupPlayerContext _context;
     
            public CreateModel(SupPlayer.Data.SupPlayerContext context)
            {
                _context = context;
            }
     
            public IActionResult OnGet()
            {
                return Page();
            }
     
            [BindProperty]
            public Playlists Playlists { get; set; }
     
            // To protect from overposting attacks, please enable the specific properties you want to bind to, for
            // more details see https://aka.ms/RazorPagesCRUD.
            public async Task<IActionResult> OnPostAsync()
            {
                if (!ModelState.IsValid)
                {
                    return Page();
                }
     
                Playlists playlist = new Playlists { Name = Playlists.Name, Gender = Playlists.Gender, Author = User.Identity.Name, MusicsList = new List<Musics> { new Musics { Name = "test", Path = "testtest@test" } } };
     
     
                /* Ne pas tenir compte de cette ligne en commentaire ;)
                 * Playlists playlist = new Playlists { Name = Playlists.Name, Gender = Playlists.Gender, Author = User.Identity.Name };*/
     
     
                _context.Playlists.Add(playlist);
                await _context.SaveChangesAsync();
     
                return RedirectToPage("./Index");
            }
        }
    }

    Merci par avance de votre aide, qui me serait très utile ... j'ai fait de très nombreuses recherche avant de demander de l'aide sur un forum en vain ... :/
    Bien cordialement,

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Il faut charger les entites liees a ton entite principale (ici Playlist). Pour faire cela, tu peux utiliser les l'une des solutions decrite ici : Loading Related Entities.

    Dans ton cas je pense que le "Eagerly Loading" est la meilleure solution (en utilisant la methode d'extension Include). Si tu as un gros volume de donnees, tu ne voudras pas tout charger d'un coup donc il vaudra mieux utiliser le Lazy Loading...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

Discussions similaires

  1. Réponses: 5
    Dernier message: 02/12/2015, 11h50
  2. Utilisation d'une list of() dans un autre thread
    Par Morphee_ dans le forum VB.NET
    Réponses: 6
    Dernier message: 07/12/2012, 14h22
  3. [WSS3] utiliser la valeur d'une liste dans une autre
    Par chatroux dans le forum SharePoint
    Réponses: 2
    Dernier message: 21/10/2008, 13h51
  4. utiliser une liste dans un tableau croisé.
    Par zaatour dans le forum Cognos
    Réponses: 1
    Dernier message: 05/12/2007, 20h44
  5. Réponses: 7
    Dernier message: 29/04/2007, 10h37

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