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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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