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 :

Concaténer 2 vue en 1


Sujet :

ASP.NET

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2019
    Messages : 6
    Par défaut Concaténer 2 vue en 1
    Bonsoir,

    Je travaille sur Visual Studio 2017.

    Grâce à EntityFramework, on peut générer automatiquement les controlleur et les vues (fonctionnalité CRUD) à partir d'un modèle,
    ce que je cherche à faire, c'est avoir une page Create et Index sur une seule page avec 2 modèles (classe) différents.

    J'ai cherché avec les partial view et l'ajax mais pas de solution qui a fonctionné.

    En espérant que vous pourrez m'aider, passez une bonne soirée.

    Guillaume JOLY

  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
    Citation Envoyé par guillaume000 Voir le message
    ce que je cherche à faire, c'est avoir une page Create et Index sur une seule page avec 2 modèles (classe) différents.
    Tu peux creer un Model / ViewModel specifique qui te permettra de passer les 2 modeles dont tu as besoin. Par exemple :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class TonViewModel
    {
        public A TonCreateModel { get; set; }
     
        public B TonIndexModel { get; set; }
    }
    Ensuite dans ta page tu declares ton model en tant que TonViewModel, et tu utilises les proprietes Model.TonCreateModel ou Model.TonIndexModel au gre de tes besoins.
    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.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2019
    Messages : 6
    Par défaut
    Bonsoir DotNetMatt, merci pour votre réponse,

    J'avais déjà essayé cette méthode et j'ai ce problème :
    "The model item passed into the dictionary is of type 'System.Collections.Generic.List"

    Et je bloque sur ce point. Pour exprimer mon besoin autrement, j'ai 2 modèles différents, j'ai besoin d'avoir le Create de mon model B, et l'index du model A juste en dessous sur une seule page View.

    Si j'ai bien compris la méthode que vous m'avez proposé, on peut seulement appeler des propriétés de chaque classe, moi j'ai besoin de concaténer 2 vues de 2 Modèles différents en 1.

    En espérant avoir été suffisamment clair.

    Guillaume

  4. #4
    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
    Citation Envoyé par guillaume000 Voir le message
    J'avais déjà essayé cette méthode et j'ai ce problème :
    "The model item passed into the dictionary is of type 'System.Collections.Generic.List"
    C'est parce que tu as passe une liste d'objets au lieu de la classe attendue par ta vue.... On va reprendre les bases car tu n'a visiblement pas compris comment fonctionne MVC.

    Donc tu as tes 2 modeles :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        public class CreateViewModel
        {
            public int Id { get; set; }
     
            public string Description { get; set; }
        }
    et :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        public class IndexViewModel
        {
            public Guid Id { get; set; }
            public string Name { get; set; }
     
            public IList<string> UneListe { get; set; }
        }

    Et finalement le modele qu'on va passer a la view :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        public class TonViewModel
        {
            public IndexViewModel Index { get; set; }
     
            public CreateViewModel Create { get; set; }
        }

    Dans le Controller, on va instancier tout cela et l'injecter dans la vue :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        public IActionResult Index()
        {
            // Ici tu mets ton code pour initialiser ton view model...
            var tonViewModel = new TonViewModel
            {
                Create = new CreateViewModel { Id = 1, Description = "ABC" },
                Index = new IndexViewModel { Id = Guid.NewGuid(), Name = "DEF", UneListe = new List<string> { "A", "B", "C" } }
            };
     
            // Ici tu injectes le view model dans la vue
            return View(tonViewModel);
        }

    Citation Envoyé par guillaume000 Voir le message
    Si j'ai bien compris la méthode que vous m'avez proposé, on peut seulement appeler des propriétés de chaque classe, moi j'ai besoin de concaténer 2 vues de 2 Modèles différents en 1.
    Il faut utiliser la methode donnee, puis se debrouiller avec soit une seule vue, soit utiliser des Partial Views. Pour cette seconde option, il te suffira de faire quelque chose comme suit, dans ta page CSHTML :
    Code ASP.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @Html.Partial("_PartialCreate", Model.Create)
    @Html.Partial("_PartialIndex", Model.Index)
    Ou bien si tu utilises les Razor Tags :
    Code ASP.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <partial name="_PartialCreate" model="Model.Create" />
    <partial name="_PartialIndex" model="Model.Index" />

    Chaque Partial View est mappee sur leur model respectif. Pour _PartialCreate.cshtml :
    Code ASP.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @model CreateViewModel
     
    @*
        Ici tu fais ce que tu veux avec ton CreateViewModel
    *@
     
    <div>@Model.Id - @Model.Description</div>

    Et pour _PartialIndex.cshtml :
    Code ASP.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    @model IndexViewModel
    @*
        Ici tu fais ce que tu veux avec ton IndexViewModel
    *@
     
    <div>@Model.Id</div>
     
    @foreach (var item in Model.UneListe)
    {
        <div>Value: @item</div>
    }

    Il est recommande d'utiliser les partial views afin de clairement separer les comportements et pour la clarte du code. Cependant tu peux obtenir le meme resultat directement dans la vue CSHTML :
    Code ASP.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    @model TonViewModel
     
    <div>@Model.Index.Id</div>
     
    <div>@Model.Create.Id - @Model.Create.Description</div>
     
    @foreach (var item in Model.Index.UneListe)
    {
        <div>Value: @item</div>
    }
    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.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2019
    Messages : 6
    Par défaut
    En effet j'ai commencé le MVC que récemment.

    Merci pour votre réponse, j'ai bien suivi votre démarche et c'est beaucoup + clair pour moi maintenant, j'arrive à utiliser les partials View avec Edit et Create de 2 modèles différents.

    Dès que je veux rajouter la partial view Index, j'ai toujours la même erreur "The model item passed into the ViewDataDictionary is of type 'AMP40.Models.Chantier', but this ViewDataDictionary instance requires a model item of type 'System.Collections.Generic.IEnumerable".

    Je pense que l'erreur vient de l'appelle de la page @model IEnumerable<AMP40.Models.Chantier> (du partial View Index).
    En remplaçant par @model Chantier, j'ai l'erreur : "L'instruction foreach ne peut pas fonctionner sur des variables de type chantier, car chantier ne contient pas de définition d'instance publique pour GetEnumerator".

    Je suis toujours bloqué.

    Une idée de comment je pourrais faire ?

    Merci encore,
    Guillaume

  6. #6
    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
    Sans connaitre ton code difficile de t'aider precisement, mais ce qu'on peut dire de maniere generale :
    1 - Le type que tu injectes dans ta view / partial view doit etre le meme que le type du model.
    2 - Et pour le message a propos du foreach, il faut l'utiliser sur une propriete de type Liste (IList<T>, IEnumerable<T>...).
    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.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2019
    Messages : 6
    Par défaut
    Bonjour DotNetMatt,

    J'ai exactement suivi votre démarche, 2 model (chantier, Action),
    code au niveau du controller Chantier :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            public IActionResult ChantierAction()
            {
     
               var ChantierAction = new ChantierAction();
     
                return View(ChantierAction);
     
            }

    Et après j'ai générer les vues comme vous me l'avez conseillé.

    Dans mes Vues:

    type _PartialCreateAction : @model AMP40.Models.Action.
    type _PartialIndexChantier : @model IEnumerable<AMP40.Models.Chantier>.

    Vue globale ChantierAction :

    Code ASP.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <partial name="_PartialCreateAction" model="Model.Action" />
    @Html.Partial("_PartialIndexChantier", new List<AMP40.Models.Chantier>())

    La photo A correspond à l'index de la vue Chantier, dans la photo B j'ai réussi a réunir les partials vue Create de Action et l'index de Chantier mais il me manque mes données que vous pouvez voir sur la photo A.

    Comment récupérer ces données ?

    Merci encore,
    Guillaume
    Images attachées Images attachées   

  8. #8
    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
    Tu n'es pas loin du resultat Dans ta vue partielle _PartialIndexChantier, ton model est de type IEnumerable<AMP40.Models.Chantier>.

    Donc ton foreach doit s'appliquer sur le model directement. Exemple a mettre dans la vue partielle (en imaginant que ta classe Chantier contient une propriete Id) :
    Code ASP.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @foreach (var chantier in Model)
    {
        <div>Id: @chantier.Id</div>
    }
    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.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2019
    Messages : 6
    Par défaut
    Merci beaucoup pour votre aide, j'ai bien avancé grâce à vous, mais le problème persiste.

    Dans _PartialIndex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     @foreach(var item in Model)
            {
                <tr>
                    <td>
                        @item.ChantierNumero
                    </td>
                </tr>
            }
    J'ai également essayé avec la syntaxe générer automatiquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <td>
                        @Html.DisplayFor(modelItem => item.ChantierNumero)
                    </td>
    Ne m'affiche aucune données =( également. Peut-être est-ce dans l'appel de page de vue global qu'il y a un problème ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Html.Partial("_PartialIndex", new List<AMP40.Models.Chantier>());
    Ou dans le controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            public IActionResult Index2()
            {
                var ActionChantier = new ActionChantier
                {
                    Action = new Models.Action { ActionID = 1 },
                    Chantier = new Chantier { ChantierID = 2 }
                };
     
                return View(ActionChantier);
            }

    Désolé de vous déranger mais j'ai vraiment besoin d'aide sur ce sujet,
    Guillaume

  10. #10
    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
    Citation Envoyé par guillaume000 Voir le message
    Ne m'affiche aucune données =( également. Peut-être est-ce dans l'appel de page de vue global qu'il y a un problème ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Html.Partial("_PartialIndex", new List<AMP40.Models.Chantier>());
    Ah ben c'est normal tu passes une liste initialisee mais vide en parametre: new List<AMP40.Models.Chantier>().

    Citation Envoyé par guillaume000 Voir le message
    Ou dans le controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            public IActionResult Index2()
            {
                var ActionChantier = new ActionChantier
                {
                    Action = new Models.Action { ActionID = 1 },
                    Chantier = new Chantier { ChantierID = 2 }
                };
     
                return View(ActionChantier);
            }
    Dans ta classe ActionChantier tu dois avoir une propriete de type IEnumerable<AMP40.Models.Chantier>, qui va contenir les elements a afficher dans le foreach. Ensuite dans le controller tu y mets les donnees.

    Puis tu fais quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Html.Partial("_PartialIndex", Model.TaNouvelleProprieteDeTypeIEnumerable);
    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.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2019
    Messages : 6
    Par défaut
    Bonjour DotnetMatt,

    Merci encore de m'avoir accompagné sur ce sujet,

    Je suis arrivé à un résultat en faisant comme ceci :

    Controller :


    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
    public IActionResult Index()
            {
     
                 var ChantierAction = new ChantierAction()
                 {
                     Action = new Models.Action { ActionID = 3, ActionNom = "ABC" },
                     Chantier = new Chantier { ChantierID = 4, ChantierNature = "DEF" },
                 };
     
                List<Chantier> ChantierAction2 = new List<Chantier>();
     
                ChantierAction2 = _context.Chantier.ToList();
     
                ViewData["ListeChantier"] = ChantierAction2;
     
                // Ici tu injectes le view model dans la vue
                return View(ChantierAction);
            }
    Et dans ma vue Global :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <partial name="_PartialCreateAction" model="Model.Action" />
     
    @Html.Partial("_PartialIndexChantier", ViewData["ListeChantier"] as IEnumerable<AMP40.Models.Chantier>);
    Je vous tiens au courant au fur et à mesure de l'avancée,
    Guillaume

  12. #12
    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
    Ca marche aussi !

    N'oublie pas de marquer le post en resolu, a l'aide du bouton Resolu tout en bas de la discussion (just apres le dernier message)
    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.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/03/2018, 09h30
  2. Réponses: 3
    Dernier message: 13/02/2015, 16h30
  3. Réponses: 3
    Dernier message: 07/09/2006, 12h00
  4. [Crystal Report] Utilisation des vues de sql serveur
    Par Olivierakadev dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 15/11/2002, 17h44
  5. compression de données du point de vue algorithmique
    Par GoldenEye dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 26/06/2002, 15h51

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