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 :

envoyer une liste conditionnée à une vue [Débutant]


Sujet :

ASP.NET MVC

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 65
    Points : 48
    Points
    48
    Par défaut envoyer une liste conditionnée à une vue
    Bonjour,

    Je voudrai passer à ma vue une liste d'enregistrements de ma base de données spécifique :

    Je veux afficher, par exemple, la liste de tous les clients dont le code postal est 69008 .

    Comment faire sachant que dans mon contrôleur j'ai simplement ce code ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public ActionResult Index()
            {
                return View(db.CLIENTS.ToList());
            }
    Je souhaiterai programmer ça par le contrôleur si possible...

    D'avance merci.

    Cordialement

  2. #2
    Membre éprouvé Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Points : 947
    Points
    947
    Par défaut
    Salut,

    Tu dois surement avoir une propriété "CodePostal" dans la liste de clients.
    Donc, très simplement, on peut écrire :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public ActionResult Index()
    {
          return View(db.CLIENTS.Where(o => o.CodePostal == "69008").ToList());
    }

    La vue aura tous les clients qui ont un code postal égal à 69008.

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 65
    Points : 48
    Points
    48
    Par défaut
    Nickel !!!

    Merci.

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 65
    Points : 48
    Points
    48
    Par défaut
    Question subsidiaire :

    Comment intégrer ce code postal en tant que paramètre ?

    Supposons que l'utilisateur veuille faire une recherche par code postal dans la liste des clients depuis un formulaire de recherche.

    On obtiendra dans le contrôleur un Request.Form["code_postal"]...

    Comment l'intégrer dans la "requête" ?

    J'ai tenté ce code mais j'ai un message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    string lo_chaine ="";
     
    if (Request.Form["nom_client"].ToString() != "")
    {
          lo_chaine = "o => o.CC_CP==" + Request.Form["nom_client"].ToString();
    }
     
    return View(db.CLIENTS_ADR.Where(lo_chaine));
    erreur : System.Data.Entity.DbSet<xxxxxxxxx.Models.CLIENTS_ADR>' ne contient pas une définition pour 'Where' et la meilleure surcharge de la méthode d'extension 'System.Linq.Enumerable.Where<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,int,bool>)' contient des arguments non valides

    Cordialement

  5. #5
    Membre éprouvé Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Points : 947
    Points
    947
    Par défaut
    La méthode where attend un predicate donc tu ne peux pas mettre une chaîne.

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    string codePostal = Request.Form["code_postal"];
    List<CLIENTS_ADR> clients = new List<CLIENTS_ADR>();
    if (!String.IsNullOrEmpty(codePostal))
    {
        clients = db.CLIENTS_ADR.Where(o => o.CC_CP == codePostal).ToList();
    }
    else
    {
        // Que faire s'il n'y a pas de code postal ?
    }
     
    return View(clients);

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 65
    Points : 48
    Points
    48
    Par défaut
    Merci de ta réponse yonpo.

    Effectivement ta solution est viable ... pour 1 critère de recherche mais si comme moi tu peux avoir jusqu'à 5 ou 6, c'est ingérable avec des if (à mon avis maintenant je peux me tromper )

    Je faisais ainsi en asp : en fonction des champs renvoyés depuis le module de recherche, je créais ma requête SQL dans une chaîne et en avant Guinguamp.

    Citation Envoyé par yonpo Voir le message

    // Que faire s'il n'y a pas de code postal ?
    Je peux afficher une page d'avertissement où équivalente.

    Aurais tu une solution alternative pour mon problème de requête dynamique ?

    Cordialement

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 65
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    J'ai trouvé la réponse à mon problème :

    Je poste pour ceux que ça peut aider d'autant plus que c'est ultra simple et que ça fonctionne pour x conditions (3 dans mon cas)


    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
    string nomclient = Request.QueryString["nom_client"];
    string cpclient = Request.QueryString["cp_client"];
    string siretclient = Request.QueryString["siret_client"];
     
    // Par défaut on affiche tout
     
    var clients = (from m in db.CLIENTS_ADR select m).ToList();
     
    // Si l'un des trois champs est rempli, on filtre.
     
    if (!String.IsNullOrEmpty(nomclient) || !String.IsNullOrEmpty(siretclient) || !String.IsNullOrEmpty(cpclient))
    {
    clients = (from m in db.CLIENTS_ADR where (m.CL_NOM.Contains(nomclient) || String.IsNullOrEmpty(nomclient)) && (m.ADRCL_CP.Contains(cpclient) || String.IsNullOrEmpty(cpclient)) && (m.CL_SIRET == siretclient || String.IsNullOrEmpty(siretclient)) select m).ToList();
    }
     
    return View(clients);
    Cordialement

  8. #8
    Membre confirmé Avatar de Jabbal'H
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 403
    Points : 580
    Points
    580
    Par défaut
    Attention, car tu exécute deux fois la requête si une variable est rempli, ce qui est inutile.
    Ton cas par défaut devrait plutôt être exécuté dans un else.

    Je le ferais plutôt comme çà
    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
     
    public IEnumerable<CLIENTS_ADR> FilterListIfNeed(IEnumerable<CLIENTS_ADR> liste, string nom, string siret, string adresse)
            {
                if (TestAll(nom,siret,adresse))
                {
                    return liste.Where(x =>
                                GetFilter(x.CL_NOM, nom) &&
                                GetFilter(x.ADRCL_CP, adresse) &&
                                GetFilter(x.CL_SIRET, siret));
                }
                else
                {
                    return liste;
                }
     
     
            }
     
            private bool TestAll(params String[] args)
            {
                return args.Any<string>(x => !string.IsNullOrEmpty(x));
            }
     
     
            public bool GetFilter(string delegateValue, string value)
            {
                return string.IsNullOrEmpty(value) || delegateValue.Contains(value);
            }
    " Je préfère comprendre les gens qui ne me comprennent pas "

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 65
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    Ta remarque est pertinente Jabbal'h, je vais corriger mon code.

    Merci.

    Cordialement

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

Discussions similaires

  1. [Lisp][IA] Supprimer une liste d'une liste de listes
    Par Superleo2999 dans le forum Lisp
    Réponses: 5
    Dernier message: 22/03/2010, 10h51
  2. Réponses: 12
    Dernier message: 12/09/2007, 16h28
  3. [PRBL]Caste une liste d'une liste d'objet
    Par stephane92400 dans le forum Langage
    Réponses: 4
    Dernier message: 07/08/2007, 21h01
  4. Appel d'une liste dans une liste (JSTL)
    Par abalgue dans le forum Hibernate
    Réponses: 4
    Dernier message: 15/06/2007, 10h56
  5. STL : retirer une liste d'une liste
    Par DEVfan dans le forum SL & STL
    Réponses: 13
    Dernier message: 05/01/2007, 20h49

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