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 :

[MVC] Quelques questions au niveau du Model et du Controller


Sujet :

ASP.NET MVC

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 12
    Points : 11
    Points
    11
    Par défaut [MVC] Quelques questions au niveau du Model et du Controller
    Bonjour,

    Je suis sur Visual Studio 2010 et sur le .NET 4.0 et j'utilise le dernier framework MVC en ASP.NET.

    Mon problème se trouve dans plusieurs niveaux.

    Je m'explique:

    Premièrement, j'utilise Entity Framework comme DataLayer dans un projet distinct.

    Dans une page web, j'appelle une action(méthode) sur mon controller pour faire la recherche. Cette action fait sommairement une requête LINQ pour trouver l'information.

    Voilà le code :
    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
     
            [AcceptVerbs(HttpVerbs.Get)]
            public ActionResult Search(string arrive, string depart, string codeVille, int rate)
            {
     
                if (arrive != null && depart != null && codeVille != null && rate != null)
                {
                    string format = "d/M/yyyy";
                    var provider = new CultureInfo("fr-FR");
     
                    var dateArrive = DateTime.ParseExact(arrive, format, provider);
                    var dateDepart = DateTime.ParseExact(arrive, format, provider);
                    var resultat = from lProduit in _ctx.ListeProduits
                                   where lProduit.CodeVille == codeVille && lProduit.Cote == rate &&
                                   lProduit.DateHeureVente_Local >= dateArrive &&
                                   lProduit.DateHeureVenteFin_Local <= dateDepart
                                   select new 
                                   {
                                        lProduit.Salle.NomSalle,
                                        lProduit.NomVille,
                                        lProduit.Cote,
                                        lProduit.GammePrixMin,
                                        lProduit.GammePrixMax,
                                        lProduit.Salle.Adresse,
                                        lProduit.Salle.DescSalleLang,
                                   };
                    ViewData["resultat"] = resultat;
                    if (resultat.Count() != 0)
                    {
                        //return RedirectToAction("Resultat");
                        return View("Resultat", resultat);
                    }   
                }
                return PartialView("AucunResultat");   
     
     
            }
    Comme vous voyez, c'est dans cette section que cela pose problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /*LINQ*/
    ...
    select new
    {
    ...
    };
    , car ce nouvel objet n'est pas reconnu dans ma vue fortement typée.

    Comme faire que je puisse avoir accès a mon résultat depuis ma vue ?

    Merci de votre aide

    Bonne journée !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Salut,

    J'avais oublié de montrer le message d'erreur quand j'essaie d'exécuter la page.

    Erreur du serveur dans l'application '/MvcWebApp'.
    L'élément de modèle passé dans le dictionnaire est de type 'System.Data.Objects.ObjectQuery`1[<>f__AnonymousType1`7[System.String,System.String,System.Int16,System.Decimal,System.Decimal,System.String,System.String]]', mais ce dictionnaire requiert un élément de modèle de type 'System.Collections.Generic.IEnumerable`1[DataLayer.ListeProduit]'.
    Description : Une exception non gérée s'est produite au moment de l'exécution de la requête Web actuelle. Contrôlez la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.

    Détails de l'exception: System.InvalidOperationException: L'élément de modèle passé dans le dictionnaire est de type 'System.Data.Objects.ObjectQuery`1[<>f__AnonymousType1`7[System.String,System.String,System.Int16,System.Decimal,System.Decimal,System.String,System.String]]', mais ce dictionnaire requiert un élément de modèle de type 'System.Collections.Generic.IEnumerable`1[DataLayer.ListeProduit]'.

    Erreur source:

    Une exception non gérée s'est produite lors de l'exécution de la requête Web actuelle. Les informations relatives à l'origine et l'emplacement de l'exception peuvent être identifiées en utilisant la trace de la pile d'exception ci-dessous.

    Trace de la pile:

    [InvalidOperationException: L'élément de modèle passé dans le dictionnaire est de type 'System.Data.Objects.ObjectQuery`1[<>f__AnonymousType1`7[System.String,System.String,System.Int16,System.Decimal,System.Decimal,System.String,System.String]]', mais ce dictionnaire requiert un élément de modèle de type 'System.Collections.Generic.IEnumerable`1[DataLayer.ListeProduit]'.]
    System.Web.Mvc.ViewDataDictionary`1.SetModel(Object value) +396
    System.Web.Mvc.ViewDataDictionary..ctor(ViewDataDictionary dictionary) +692
    System.Web.Mvc.ViewPage`1.SetViewData(ViewDataDictionary viewData) +74
    System.Web.Mvc.WebFormView.RenderViewPage(ViewContext context, ViewPage page) +100
    System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +386
    System.Web.Mvc.<>c__DisplayClass14.<InvokeActionResultWithFilters>b__11() +33
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +613
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +263
    System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +709
    System.Web.Mvc.Controller.ExecuteCore() +162
    System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__4() +58
    System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +20
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +453
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +371


    Informations sur la version : Version Microsoft .NET Framework :4.0.30319; Version ASP.NET :4.0.30319.1

  3. #3
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Ne pas utiliser de types anonymes et créer une structure qui contiendra tes données.

  4. #4
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    Citation Envoyé par PitMaverick78 Voir le message
    Ne pas utiliser de types anonymes et créer une structure qui contiendra tes données.
    Exactement. En plus quand tu créeras une nouvelle vue (via la boite de dialogue) tu pourras indiquer cette structure afin de générer les champs correspondants.
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Merci pour cette réponse!

    Je voudrais savoir où je mets cette structure... Dans le dossier « /Models ».

    Un autre point: Est-ce que je fais une « struct » ou une classe avec des propriétés?

    Je vous pose cette question, car je ne trouve pas vraiment l'utilité du répertoire modèle dans le cas ou nous utilisons Entity Framework comme « modèle ».

    Comment structurez-vous votre projet avec Entity Framework et votre projet ASP MVC dans ce cas?

    Questions que je n'ai point trouvé réponse... sur le web

    Merci de faire part de votre expérience dans ce domaine.

    Bonne journée!

  6. #6
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    Citation Envoyé par Arphus Voir le message
    Je voudrais savoir où je mets cette structure... Dans le dossier « /Models ».
    Oui, ou dans une dll à part.

    Citation Envoyé par Arphus Voir le message
    Un autre point: Est-ce que je fais une « struct » ou une classe avec des propriétés?
    Une classe

    Citation Envoyé par Arphus Voir le message
    Comment structurez-vous votre projet avec Entity Framework et votre projet ASP MVC dans ce cas?
    Je n'utilise pas les entités EF directement. Je fais une classe spécifique à chaque vue (Data Access Object).
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par The_badger_man Voir le message
    Je n'utilise pas les entités EF directement. Je fais une classe spécifique à chaque vue (Data Access Object).
    He? Bien comment? Est-ce que tu as un exemple de ce que tu avances?

    Il faut dire que je ne connais pas vraiment l'utilité du DAO et l'appliquer encore moins...

    Qu'est-ce que vous me conseillez comme ressource pour appliquer le « DAO » avec Entity Framework 4.0?

    Merci!

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Points : 92
    Points
    92
    Par défaut
    Je pense que la réponse t'a déjà été donnée, mais c'est un peu pour ré ouvrir la discussion sur ce sujet.
    Sur un de mes premiers projet utilisant MVC 2.0 (cela fait seulement 3 mois que je l'utilise, mais il est déjà adopté ^^), mon DAO était formé de classes liées a chaque vue, tel que the_badger_man le dit.
    L'avantage de ces classes, c'est qu'avec toutes les annotations que tu peux rajouter sur chaque élément te permet, avec visual studio 2010 (je pense que 2008 aussi), de générer du code pour les actions de base de chaque vue (Index, Create, Edit, Delete).
    Ce code tu le génère de la façon suivante : "Clic droit sur une action de ton Controller" ==> "Ajouter une vue" ==> Cocher "Créer une vue fortement typée" ==> Choisir la classe "Model" pour ta page ==> Choisir le contenu de la vue et la master page.

    En fonction du contenu choisi, cela té créera soit le formulaire de Création/Modification, soit un affichage d'une liste ou du détail des éléments.

    Donc un petit exemple pour illustrer cela :
    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
     
    Code du Model : 
     
    public class PageCreationModel
        {
            [Required]
            [DataType(DataType.Text)]
            [DisplayName("Titre de la page")]
            public string TitrePage { get; set; }
     
            [Required]
            [DataType(DataType.Text)]
            [DisplayName("Langue de la page")]
            public string Langue { get; set; }
     
            [Required]
            [DataType(DataType.Text)]
            [DisplayName("Autre langue")]
            public string Langue2 { get; set; }
     
            [Required]
            [DataType(DataType.MultilineText)]
            [DisplayName("Contenu de la page")]
            public string PageContent { get; set; }
     
        }
    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
     
    Code généré pour la vue Create
     
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
     
        <h2><%: Html.WixelLabel( WixelLabels.CreationDeLaPage ) %> : <%: Model.TitrePage %></h2>
     
        <% using (Html.BeginForm()) {%>
            <%: Html.ValidationSummary(true) %>
     
            <fieldset>
                <legend><%:  Html.WixelLabel( WixelLabels.Champs ) %></legend>
     
                <div class="editor-label">
                    <%:  Html.WixelLabel( WixelLabels.TitrePage) %>
                </div>
                <div class="editor-field">
                    <%: Html.TextBoxFor(model => model.TitrePage) %>
                    <%: Html.ValidationMessageFor(model => model.TitrePage) %>
                </div>
     
                <div class="editor-label">
                    <%:  Html.WixelLabel( WixelLabels.PageLangue) %>
                </div>
                <div class="editor-field">
                    <%: Html.DropDownListFor( m=> m.Langue, Html.WixelLanguagesList( true) )  %>
                </div>
     
                <div class="editor-field">
                    <%: Html.CKEditor( "PageContent", "" ) %>
                    <%: Html.ValidationMessageFor(model => model.PageContent) %>
                </div>
     
                <p>
                    <input type="submit" value="<%: Html.WixelLabel( WixelLabels.CreerLaPage) %>" />
                </p>
            </fieldset>
     
        <% } %>
     
        <div>
            <%: Html.ActionLink("Back to List", "Index") %>
        </div>
     
    </asp:Content>
    En plus, pour chaque propriétés de ta classe, tu peux rajouté des annotations personnalisées te permettant de valider ton formulaire & cie, ce qui rend en plus le traitement des erreurs encore plus automatisé.

    J'espère que ca a pu répondre à ta question, mais vu mon recul sur ce framework, il faut prendre cet exemple a titre d'informations, car chaque jour je découvre des nouveautés.

    Bonne journée

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/03/2014, 18h49
  2. Quelques questions sur mon application en pattern MVC
    Par Pavel37 dans le forum Débuter
    Réponses: 0
    Dernier message: 08/03/2013, 11h13
  3. Réponses: 8
    Dernier message: 21/03/2012, 11h00
  4. [Java][MVC+Observer] Quelques questions..
    Par JuFromParis dans le forum Design Patterns
    Réponses: 0
    Dernier message: 22/09/2010, 12h57
  5. Quelques questions sur le pattern MVC
    Par maa dans le forum Général Dotnet
    Réponses: 40
    Dernier message: 11/10/2009, 03h48

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