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 :

Formulaire de saisie à partir d'une sélection issue de listes déroulantes [Débutant]


Sujet :

ASP.NET MVC

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant E-Business
    Inscrit en
    Octobre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 33
    Points : 21
    Points
    21
    Par défaut Formulaire de saisie à partir d'une sélection issue de listes déroulantes
    Bonjour,

    Je débute sur Visual Studios 2015 et en développement globalement.

    Je souhaite créer une appli web asp net MVC.
    Mon objectif est de permettre à des responsables d'agence de saisir les horaires de leur personnel chaque jour. (heure d'arrivée et heure de fin).
    J'aimerai qu'ils puisseent sélectionner dans une liste déroulante une agence (centrale), plusieurs salariés (chauffeurs) ainsi que la date correspondante.
    En fonction de ces choix je voudrai qu'ils soient redirigés vers une autre page (cette fois pour saisir les horaires des salariés).
    Celle-ci reprendra les éléments sélectionnés pour obtenir un tableau ou chaque ligne correspond aux chauffeurs et 2 colonnes heuredebut et heurefin non renseignées.
    Ceci afin de saisir les horaires dans ces 2 colonnes.

    Pour le moment j'ai réussi à créer ma page de sélection avec 2 listes déroulantes et une zone de saisie pour la date.

    Mon soucis est de créer ma seconde page de saisie décrite ci-dessus...je bloque...

    Je vous mets mes codes ci-dessous en espérant que vous puissiez m'aiguiller et me donner de bon conseils
    Merci d'avance


    Code C# : 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
    // GET: Sélection des données
            public ActionResult Selection()
            {
                ViewBag.Central = new SelectList(db.Centrales, "ID", "NomCentrale");
     
                var model = db.Chauffeurs;
                return View(new Chauffeurslist() { Chauffeurs = model.ToList() });
            }
     
            [HttpPost]
            public ActionResult Selection(Chauffeurslist model)
            {
                List<Chauffeurheures> list = new List<Chauffeurheures>();
                foreach (var item in model.SelectedIDs)
                {
                    Chauffeurheures c = new Chauffeurheures();
                    c.Chauffeurs = item;
                    var heure = db.Heures.Where(a => a.ChauffeurID == item && a.CentraleID == model.Central && a.DateTravail == model.DateTravail).FirstOrDefault();
                    if (heure != null)
                    {
                        c.heurededebut = heure.HeureDebut;
                        c.heuredefin = heure.HeureFin;
                    }
     
                    list.Add(c);
                }
     
                return RedirectToAction("Saisie");
     
            }
     
    // GET: Saisie
            public ActionResult Saisie()
            {
                // je n'ai aucune idée sur cette partie et comment reprendre les informations de la sélection ci-dessus
                return View();
            }
    Mes modèles

    Code C# : 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 class Chauffeur
        {
            [DatabaseGenerated(DatabaseGeneratedOption.None)]
            public int ID { get; set; }
            public string NomChauffeur { get; set; }
            public string PrenomChauffeur { get; set; }
            public DateTime DateNaissance { get; set; }
     
            public virtual ICollection<Heure> Heures { get; set; }
        }
    }
     
    public class Chauffeurheures
        {
            public int Chauffeurs { get; set; }
            public string heurededebut { get; set; }
            public string heuredefin { get; set; }
     
            public virtual Chauffeur Chauffeur { get; set; }
        }
     
    public class Chauffeurslist
        {  
            public List<Chauffeur> Chauffeurs { get; set; }
            public List<int> SelectedIDs { get; set; }
            public int Central { get; set; }
            public DateTime DateTravail { get; set; }
        }
    Voici ma vue de selection

    Code ASP.NET : 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
    @model ApplicationWeb.Models.Chauffeurslist
     
    @{
        ViewBag.Title = "Selection";
    }
     
    <h2>Sélection des chauffeurs pour une saisie des horaires des chauffeurs</h2>
    @using (Html.BeginForm())
    {
        <div>
            <h4>Horaires</h4>
            <hr />
            <dl class="dl-horizontal">
                <dt>
                    @Html.DropDownList("Central", null, htmlAttributes: new { @class = "form-control" })
                </dt>
                <dt>
                    @Html.ListBoxFor(m => m.SelectedIDs, new MultiSelectList(Model.Chauffeurs, "ID", "NomChauffeur", Model.SelectedIDs))
                </dt>
                <dt>
                    @Html.TextBoxFor(m => m.DateTravail)
                </dt>
                <dd>
            </dl>
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Enregistrer la saisie" class="btn btn-default" />
                </div>
            </div>
        </div>
    }

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2013
    Messages : 29
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    C'est juste pour afficher la liste que tu as créé dans Selection ?
    Tu n'es pas obligé, pour accéder à une vue, de passer par une autre action ayant le même nom que la vue.

    Au lieu du RedirectToAction, tu peux retourner vers la vue qui te servira à afficher la liste des chauffeurs avec ta liste
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    return View("Saisie", list );

  3. #3
    Membre à l'essai
    Homme Profil pro
    Consultant E-Business
    Inscrit en
    Octobre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 33
    Points : 21
    Points
    21
    Par défaut
    Merci de ton aide.

    J'ai un peu de mal à comprendre le sens de ta question dsl je suis très novice...
    Je ne comprend pas le code que tu as écrit ?

    Ma vue Sélection (je pense est indispensable) car c'est elle qui ma permettre de sélectionner les informations pour construire mon tableau de saisie:
    - Liste déroulante (1 seul choix pour les centrales)
    - Liste déroulante (n chois pour les chauffeurs)
    - Saisie d'une date

    Je pensais pouvoir récupérer ces informations dans une seconde vue pour construire le tableau mais je n'y parviens pas.
    J'ai commencé à écrire quelque chose (voir ci-dessous)dans la vue sélection pour passer les informations à mon contrôleur "Saisie" mais je ne suis pas convaincu d'aller dans la bonne direction :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
     @Html.ActionLink("Saisie", "Saisie", new { CentraleID =  , ChauffeurID = }) ;

    Mon gros problème est sur le passage d'information entre deux vues ?
    Est-il possible de passer plusieurs variables (celles-ci pouvant être des listes ??) en paramètre dans mon contrôleur en les récupérant à partir d'une ligne de code telle que décrite ci-dessus dans une vue ?
    Peut-être existe-il de meilleurs solutions ?

    Dsl si je suis un peu brouillon dans mes explications.

    Merci

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2013
    Messages : 29
    Points : 40
    Points
    40
    Par défaut
    Je vais essayer d'être plus clair dans mon explication.

    Ce que j'ai compris, quand tu valides la saisie de l'horaire dans le formulaire de la vue Selection, tu passes dans l'action "Selection" qui n'autorise que le [HttpPost].
    A partir de là, tu veux passer la liste (List<Chauffeurheures>) vers la vue "Saisie" pour afficher un tableau.

    Dans mon explication, il ne faut pas passer par une autre action pour envoyer ta liste à la vue "Saisie", mais directement envoyer la liste à la vue.
    Le chemin parcouru :
    Au lieu de : action Selection > action Saisie > vue Saisie
    Tu aurai : action Selection > vue Saisie


    Le View(), renvoyé en fin d'action, peux prendre en paramètre le nom de la vue, suivi de la liste que tu souhaites lui transmettre.
    Voir : https://msdn.microsoft.com/fr-fr/lib...v=vs.118).aspx

    Donc au lieu de, dans l'action Selection
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    return RedirectToAction("Saisie");
    Tu aurais :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    return View("Saisie", list );

    Et tu récupères dans la vue la liste de tes Chauffeurheures que tu pourras afficher dans le tableau.
    L'action Saisie n'est plus utile sauf si tu le destine à d'autre tâches.

    Ce qui est bien avec MVC, c'est qu'une action n'a pas nécessairement une vue portant le même nom, voir pas de vue du tout.

    J'espère avoir répondu à ta question sur le fait de passer à la vue Saisie ta liste pour l'afficher dans un tableau.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Consultant E-Business
    Inscrit en
    Octobre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 33
    Points : 21
    Points
    21
    Par défaut
    Oui merci suite à ton dernier message j'ai bien avancé dans mon projet!

    J'arrive bien maintenant à afficher les éléments que j'ai sélectionné dans mes listes dans ma vue "Saisiedesheures".

    Je me confronte à présent à un dernier problème qui est d'enregistrer en base de données (dans la table heure = modèle heure ci-dessous) les éléments affichés dans ma vue.
    Je ne trouve pas le moyen d'enregistrer mes infos dans mon modèle "heure" sachant que ma vue "Saisiedesheures" se base sur le modèle "Chauffeurheures".
    Est-ce possible ?

    Ci-dessous :
    - Contrôleur "Selectiondesheures" après les modifications que tu m'a apporté
    - Vue "Saisiedesheures"
    - Modèle "heure"

    Merci encore

    Code C# : 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
     
    [HttpPost]
            public ActionResult Selectiondesheures(Chauffeurslist model)
            {
                List<Chauffeurheures> maliste = new List<Chauffeurheures>();
                foreach (var item in model.SelectedIDs)
                {
                    Chauffeurheures c = new Chauffeurheures();
                    c.Chauffeurs = item;
                    var heure = db.Heures.Where(a => a.ChauffeurID == item && a.CentraleID == model.Central && a.DateTravail == model.DateTravail).FirstOrDefault();
                    if (heure != null)
                    {
                        c.heurededebut = heure.HeureDebut;
                        c.heuredefin = heure.HeureFin;
                        c.DateTravail = heure.DateTravail;
     
                        var chauffeur1 = db.Chauffeur.Where(b => b.ID == item).FirstOrDefault();
                        var centrale1 = db.Centrales.Where(d => d.ID == model.Central).FirstOrDefault();
     
                        c.NomChauffeur = chauffeur1.NomChauffeur;
                        c.NomCentrale = centrale1.NomCentrale;
                    }
                    else { 
                    c.heurededebut = "";
                    c.heuredefin = "";
                    c.DateTravail = model.DateTravail;
     
                    var chauffeur2 = db.Chauffeur.Where(b => b.ID == item).FirstOrDefault();
                    var centrale2 = db.Centrales.Where(d => d.ID == model.Central).FirstOrDefault();
     
                    c.NomChauffeur = chauffeur2.NomChauffeur;
                    c.NomCentrale = centrale2.NomCentrale;
                    }
                    maliste.Add(c);
                }
                return View("Saisiedesheures",maliste);
            }

    Code C# : 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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    @model IEnumerable<PigeonApplicationWeb.Models.Chauffeurheures>
     
    @{
        ViewBag.Title = "Saisiedesheures";
    }
     
    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
     
    <h2>Saisie des heures du controlleur</h2>
     
            <table class="table">
                <tr>
                    <th>
                        @Html.DisplayNameFor(model => model.NomCentrale)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.DateTravail)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.NomChauffeur)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.heurededebut)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.heuredefin)
                    </th>
                </tr>
     
                @foreach (var item in Model)
                {
                    <tr>
                        <td>
                            @Html.DisplayFor(modelItem => item.NomCentrale)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.DateTravail)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.NomChauffeur)
                        </td>
                        <td>
                            <div class="bottom-left">
                                <div class="col-md-10">
                                    @Html.EditorFor(modelItem => item.heurededebut, new { htmlAttributes = new { @class = "form-control" } })
                                    @Html.ValidationMessageFor(modelItem => item.heurededebut, "", new { @class = "text-danger" })
                                </div>
                            </div>
                        </td>
                        <td>
                            <div class="bottom-left">
                                <div class="col-md-10">
                                    @Html.EditorFor(modelItem => item.heuredefin, new { htmlAttributes = new { @class = "form-control" } })
                                    @Html.ValidationMessageFor(modelItem => item.heuredefin, "", new { @class = "text-danger" })
                                </div>
                            </div>
                        </td>
                    </tr>
                }
     
            </table>
     
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Valider la saisie" class="btn btn-default" />
        </div>
    </div>
     
    <div>
        @Html.ActionLink("Retourner aux choix précédents", "Selectiondesheures")
    </div>
     
    }


    Code C# : 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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
     
    namespace PigeonApplicationWeb.Models
    {
        public class Heure
        {
            public int HeureID { get; set; }
            public int CentraleID { get; set; }
            public int ChauffeurID { get; set; }
            public DateTime DateTravail { get; set; }
            public string HeureDebut { get; set; }
            public string HeureFin { get; set; }
     
            public virtual Centrale Centrale { get; set; }
            public virtual Chauffeur Chauffeur { get; set; }
        }
    }

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2013
    Messages : 29
    Points : 40
    Points
    40
    Par défaut
    Pour commencer, tu va devoir modifier ton BeginForm pour qu'il envoie les valeurs vers une action qui accepte ton heure de début et de fin.
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    @Html.BeginForm("ton action", "ton controller", FormMethod.Post)
    Tu nommeras ton action comme tu voudras, pour le controller, tu mets le même que ton "Selectiondesheures".
    Le FormMethod.Post permet d'envoyer les éléments dans l'entête de la requête http au lieu de tout mettre dans la query.

    L'action doit pouvoir recevoir des heures
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    public ActionResult TonAction(List<Heure> heures)

    Ensuite, il faut que tous les champs de saisie aient pour name la même orthographe que ton modèle Heure pour le modèle binding
    Si ces champs ne doivent pas être saisie, utilise des champs hidden
    Enfin pour les nom (attribut name) de tes champs doivent être préfixé par, par exemple "Heures[i]" où i est un incrément de chaque ligne affichée.
    pour avoir :
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="text" name="Heure[0].heurededebut" class="form-control" />


    Ton projet s'appelle "Pigeon" ?

  7. #7
    Membre à l'essai
    Homme Profil pro
    Consultant E-Business
    Inscrit en
    Octobre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 33
    Points : 21
    Points
    21
    Par défaut
    Merci encore, j'ai bien compris la première partie de ta dernière réponse concernant la création d'une nouvelle action POST dans mon contrôleur Heures portant le même nom.

    En revanche, j'ai du mal à comprendre la seconde partie de ta réponse et surtout le "Heures[i]"...?
    Dsl je suis dur de la feuille !

    Sinon effectivement mon projet s'appelle "PigeonApplicationWeb", c'est le nom de la société !

    Merci

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2013
    Messages : 29
    Points : 40
    Points
    40
    Par défaut
    Sur le Heure[i] :
    Pour recevoir ta liste d'heure, il faut que ton formulaire renvoie les valeurs sous forme d'un tableau, d'où le "Heure[i]"

    La ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @foreach (var item in Model)
    Serait remplacée par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @for (int i = 0;i<Model.Count;i++)
    Et pour chaque ligne de ton tableau, les Html.EditorFor :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Html.EditorFor(modelItem => item.heurededebut, new { htmlAttributes = new { @class = "form-control" } })
    Serait remplacer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="text" name="Heure[@i].heurededebut" id="Heure[@i].heurededebut" value="@Model[i].heurededebut" class="form-control" />
    Ainsi, à la validation du formulaire, sera envoyé un tableau d'heure (attention au nom des champs après le "Heure[@i]." qui doivent correspondre au propriété de ta classe Heure)
    Et tu auras autant d'objet que de ligne dans le tableau.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Consultant E-Business
    Inscrit en
    Octobre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 33
    Points : 21
    Points
    21
    Par défaut
    Bonjour,

    Sachant que j'utilise dans ma vue le modèle "Chauffeurheures" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @model IEnumerable<PigeonApplicationWeb.Models.Chauffeurheures>/>
    Comment ma méthode POST "mon action" de mon contrôleur "mon controleur" ayant pour modèle cette fois une liste d'heures pourra récupérer les informations ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public ActionResult TonAction(List<Heure> heures)/>

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2013
    Messages : 29
    Points : 40
    Points
    40
    Par défaut
    Rien à voir, comme un fonction, tu as un type d'entrée et un type de sortie.
    Ton type d’entrée est Chauffeurlist, ton model.

    Ton type retour sont les valeurs de ton formulaire. Il n'est pas de type Chauffeurlist.
    Quand tu submit le formulaire, asp.net mvc, va essayer de faire correspondre les valeurs du formulaire avec le type d'entrée de ton action (Model binding)
    C'est pour cela qu'il faut pour chaque ligne du tableau que tu ai les champs correspondant à la classe Heure.
    Si des champs ne sont pas saisissable, tu peux en faire des champs caché (type="hidden")

    Si il manque des champs ou que l'un des champs est mal orthographié.

    Sinon, une autre manière de récupérer des champs est de passer par Request.Form("[Nom du champs]")(index) : https://msdn.microsoft.com/en-us/lib...(v=vs.90).aspx

  11. #11
    Membre à l'essai
    Homme Profil pro
    Consultant E-Business
    Inscrit en
    Octobre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 33
    Points : 21
    Points
    21
    Par défaut
    Ok, je manque énormément de théorie mais j'espère bien y remédier...

    Voici donc la vue que j'ai crée, elle me ressort bien mes infos.
    Ensuite j'ai créé mon contrôleur POST sur tes conseils mais je ne récupère rien dans le modèle.
    Je pense avoir fait pas mal d'erreur dans la vue mais j'ai beaucoup de mal à savoir où elles se situent ?
    Merci beaucoup.

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    @model List<PigeonApplicationWeb.Models.Chauffeurheures>
     
    @{
        ViewBag.Title = "Saisiedesheures";
    }
     
    @using (Html.BeginForm("recupheures", "Heures", FormMethod.Post))
    {
        @Html.AntiForgeryToken()
     
     
    <h2>Saisie des heures du controlleur</h2>
     
     
    <table class="table">
        <tr>
            <th>
                Nom de la Centrale
            </th>
            <th>
                Date de travail
            </th>
            <th>
                Nom du Chauffeur
            </th>
            <th>
                Heure de début
            </th>
            <th>
                Heure de fin
            </th>
        </tr>
     
        @for (int i = 0; i < Model.Count; i++)
        {
            <tr>
                <td>
                    @Model[i].NomCentrale
                    @Html.Hidden("Heure[@i].NomCentrale", @Model[i].NomCentrale)
                </td>
                <td>
                    @Model[i].DateTravail
                    @Html.Hidden("monheure.recupheures", @Model[i].DateTravail)
                </td>
                <td>
                    @Model[i].NomChauffeur
                    @Html.Hidden("monheure.NomChauffeur", @Model[i].NomChauffeur)
                </td>
                <td>
                    <input type="text" name="Heure[@i].heurededebut" id="Heure[@i].heurededebut" value="@Model[i].heurededebut" class="form-control" />
                </td>
                <td>
                    <input type="text" name="Heure[@i].heurededebut" id="Heure[@i].heurededebut" value="@Model[i].heurededebut" class="form-control" />
                </td>
            </tr>
        }
     
    </table>
     
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Valider la saisie" class="btn btn-default" />
                </div>
            </div>
     
            <div>
                @Html.ActionLink("Retourner aux choix précédents", "Selectiondesheures")
            </div>
     
    }

    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
     
    // Récupération des heures saisies
            [HttpPost]
            public ActionResult recupheures(List<Heure> monheure)
            {
                List<Heure> maliste = new List<Heure>();
                foreach (var item in monheure)
                {
                    Heure h = new Heure();
                    h.Centrale = item.Centrale;
                    h.CentraleID = item.CentraleID;
                    h.Chauffeur = item.Chauffeur;
                    h.ChauffeurID = item.ChauffeurID;
                    h.DateTravail = item.DateTravail;
                    h.HeureDebut = item.HeureDebut;
                    h.HeureFin = item.HeureFin;
     
                    db.Heures.Add(h);
                    db.SaveChanges();
                }
     
                    return RedirectToAction("Selectiondesheures");
            }

  12. #12
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2013
    Messages : 29
    Points : 40
    Points
    40
    Par défaut
    Ton modèle Heures est la suivante :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Heure
        {
            public int HeureID { get; set; }
            public int CentraleID { get; set; }
            public int ChauffeurID { get; set; }
            public DateTime DateTravail { get; set; }
            public string HeureDebut { get; set; }
            public string HeureFin { get; set; }
     
            public virtual Centrale Centrale { get; set; }
            public virtual Chauffeur Chauffeur { get; set; }
        }

    Les champs input doivent avoir la même nom que la variable, à la casse près.
    Il faut faire attention au information saisie pour que le binding puisse parsé les valeurs dans leurs bon type.
    Donc tu aurais :
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <input type="hidden" name="Heure[@i].HeureID" id="Heure[@i].HeureID" value="@Model[i].HeureID" />
    <input type="hidden" name="Heure[@i].CentraleID" id="Heure[@i].CentraleID" value="@Model[i].CentraleID"  />
    <input type="hidden" name="Heure[@i].ChauffeurID" id="Heure[@i].ChauffeurID" value="@Model[i].ChauffeurID" />
    <input type="hidden" name="Heure[@i].DateTravail" id="Heure[@i].DateTravail" value="@Model[i].DateTravail" />
    <input type="text" name="Heure[@i].HeureDebut" id="Heure[@i].HeureDebut" value="@Model[i].HeureDebut" class="form-control" />
    <input type="text" name="Heure[@i].HeureFin" id="Heure[@i].HeureFin" value="@Model[i].HeureFin" class="form-control" />

  13. #13
    Membre à l'essai
    Homme Profil pro
    Consultant E-Business
    Inscrit en
    Octobre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 33
    Points : 21
    Points
    21
    Par défaut
    Je suis désolé, mais j'ai suivi à la lettre ce que tu as mis mais mon modèle dans le contrôleur est toujours NULL lorsque je valide mes informations (CF Copie d'écran en pièce jointe).
    J'ai vérifié à plusieurs reprises que la CASSE est bien identique et c'est le cas...

    Ce problème ne peut-il pas provenir de mon champ HeureID (clé primaire) du modèle Heure ?
    Je dis ça car j'ai mis une valeur à 100 pour tester au départ dans la vue (même si j'enlève la ligne pour ce champ dans la vue c'est idem) car je me demandais comment le programme allait générer automatiquement une valeur de clé pour les nouveaux enregistrements ?

    Ne devrais-je pas créer un modèle heure similaire à celui existant mais sans clé primaire ?

    Merci de ton aide, je te mets le code de ma vue ci-dessous.

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    @model List<PigeonApplicationWeb.Models.Chauffeurheures>
     
    @{
        ViewBag.Title = "Saisiedesheures";
    }
     
    @using (Html.BeginForm("recupheures", "Heures", FormMethod.Post))
    {
        @Html.AntiForgeryToken()
     
     
        <h2>Saisie des heures du controlleur</h2>
     
     
        <table class="table">
            <tr>
                <th>
                    Nom de la Centrale
                </th>
                <th>
                    Date de travail
                </th>
                <th>
                    Nom du Chauffeur
                </th>
                <th>
                    Heure de début
                </th>
                <th>
                    Heure de fin
                </th>
            </tr>
     
            @for (int i = 0; i < Model.Count; i++)
            {
                <tr>
                    <td>
                        <input type="hidden" name="Heure[@i].HeureID" id="Heure[@i].HeureID" value="100" />
                        @Model[i].NomCentrale
                        <input type="hidden" name="Heure[@i].CentraleID" id="Heure[@i].CentraleID" value="1" />
                    </td>
                    <td>
                        @Model[i].DateTravail
                        <input type="hidden" name="Heure[@i].DateTravail" id="Heure[@i].DateTravail" value="@Model[i].DateTravail" />
                    </td>
                    <td>
                        @Model[i].NomChauffeur
                        <input type="hidden" name="Heure[@i].ChauffeurID" id="Heure[@i].ChauffeurID" value="@Model[i].Chauffeurs" />
                    </td>
                    <td>
                        <input type="text" name="Heure[@i].HeureDebut" id="Heure[@i].HeureDebut" value="@Model[i].heurededebut" class="form-control" />
                    </td>
                    <td>
                        <input type="text" name="Heure[@i].HeureFin" id="Heure[@i].HeureFin" value="@Model[i].heuredefin" class="form-control" />
                    </td>
                </tr>
            }
     
        </table>
     
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Valider la saisie" class="btn btn-default" />
            </div>
        </div>
     
        <div>
            @Html.ActionLink("Retourner aux choix précédents", "Selectiondesheures")
        </div>
     
    }

  14. #14
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2013
    Messages : 29
    Points : 40
    Points
    40
    Par défaut
    Pour que le binding fonctionne, il faut qu'asp.net puissent parser les informations provenant du formulaire :
    Les heures doivent avoir le format "AAAA-mm-JJ HH:MM", de préférence, utiliser un champ date ou time qui fera la conversion correctement, des entiers pour les int, etc...

    Sinon, pour ta view :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="hidden" name="Heure[@i].ChauffeurID" id="Heure[@i].ChauffeurID" value="@Model[i].Chauffeurs" />
    Que contiens la valeur : @Model[i].Chauffeurs ?
    Si tu remplace la valeur par un nombre entier ?

    Pour la clé primaire, c'est une affaire de base de donnée, via une séquence ou un champs identity.
    Si aucune valeur n'est renseigné, le binding indique la valeur par défaut.
    As tu essayé sans mettre de valeurs à aucun des champs ? normalement, tu obtiendrais un tableau dont les attribut de Heure serait par défaut (int=> 0, string => "", objet => null...)



    Voici un exemple simple qui fonctionne
    Voici le modèle, j'ai des entiers, des dates et une objet dans la classe Heure
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        public class Heure
        {
            public int HeureID { get; set; }
            public int ChauffeurID { get; set; }
            public DateTime HeureDebut { get; set; }
            public DateTime HeureFin { get; set; }
     
            public Chauffeur Chauffeur { get; set; }
        }
     
        public class Chauffeur
        {
            public string Nom { get; set; }
            public string Prenom { get; set; }
        }

    Ensuite, le controller, simple lui aussi, l'action Index en Post récupère une liste d'heure, comme ton exemple
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        public class HomeController : Controller
        {
            public ActionResult Index()
            {
                return View();
            }
     
            [HttpPost]
            public ActionResult Index(List<Heure> heures)
            {
     
                return View();
            }
        }

    Enfin la page
    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
    <h2>View</h2>
    @using(Html.BeginForm("Index", "Home", FormMethod.Post)){ 
        for (int i = 0; i < 5; i++)
        {
            <p>
            <input type="hidden" name="Heures[@i].HeureID" value="@i" />
            <input type="hidden" name="Heures[@i].ChauffeurID" value="@(i*10)"/>
            HeureDebut: <input type="time" name="Heures[@i].HeureDebut" /><br/>
            HeureFin : <input type="time" name="Heures[@i].HeureFin" /><br/>
            Chauffeur.Nom: <input type="text" name="Heures[@i].Chauffeur.Nom" /><br />
            Chauffeur.Prenom : <input type="text" name="Heures[@i].Chauffeur.Prenom" />
            </p>
        }
        <input type="submit" value="Envoyer"/>
    }
    Qui aura pour source coté client (une fois qu'il a été traité par IIS et envoyé au client, clique droit sur la page, pusi afficher le code source) :
    Code HTML : 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
    <h2>View</h2>
    <form action="/" method="post">        <p>
            <input type="hidden" name="Heures[0].HeureID" value="0" />
            <input type="hidden" name="Heures[0].ChauffeurID" value="0"/>
            HeureDebut: <input type="time" name="Heures[0].HeureDebut" /><br/>
            HeureFin : <input type="time" name="Heures[0].HeureFin" /><br/>
            Chauffeur.Nom: <input type="text" name="Heures[0].Chauffeur.Nom" /><br />
            Chauffeur.Prenom : <input type="text" name="Heures[0].Chauffeur.Prenom" />
            </p>
            <p>
            <input type="hidden" name="Heures[1].HeureID" value="1" />
            <input type="hidden" name="Heures[1].ChauffeurID" value="10"/>
            HeureDebut: <input type="time" name="Heures[1].HeureDebut" /><br/>
            HeureFin : <input type="time" name="Heures[1].HeureFin" /><br/>
            Chauffeur.Nom: <input type="text" name="Heures[1].Chauffeur.Nom" /><br />
            Chauffeur.Prenom : <input type="text" name="Heures[1].Chauffeur.Prenom" />
            </p>
            <p>
            <input type="hidden" name="Heures[2].HeureID" value="2" />
            <input type="hidden" name="Heures[2].ChauffeurID" value="20"/>
            HeureDebut: <input type="time" name="Heures[2].HeureDebut" /><br/>
            HeureFin : <input type="time" name="Heures[2].HeureFin" /><br/>
            Chauffeur.Nom: <input type="text" name="Heures[2].Chauffeur.Nom" /><br />
            Chauffeur.Prenom : <input type="text" name="Heures[2].Chauffeur.Prenom" />
            </p>
            <p>
            <input type="hidden" name="Heures[3].HeureID" value="3" />
            <input type="hidden" name="Heures[3].ChauffeurID" value="30"/>
            HeureDebut: <input type="time" name="Heures[3].HeureDebut" /><br/>
            HeureFin : <input type="time" name="Heures[3].HeureFin" /><br/>
            Chauffeur.Nom: <input type="text" name="Heures[3].Chauffeur.Nom" /><br />
            Chauffeur.Prenom : <input type="text" name="Heures[3].Chauffeur.Prenom" />
            </p>
            <p>
            <input type="hidden" name="Heures[4].HeureID" value="4" />
            <input type="hidden" name="Heures[4].ChauffeurID" value="40"/>
            HeureDebut: <input type="time" name="Heures[4].HeureDebut" /><br/>
            HeureFin : <input type="time" name="Heures[4].HeureFin" /><br/>
            Chauffeur.Nom: <input type="text" name="Heures[4].Chauffeur.Nom" /><br />
            Chauffeur.Prenom : <input type="text" name="Heures[4].Chauffeur.Prenom" />
            </p>
        <input type="submit" value="Envoyer"/>
    </form>

    Je récupère dans l'action la liste des heures, car le binding a fonctionné.
    Essaye de ton côté.

  15. #15
    Membre à l'essai
    Homme Profil pro
    Consultant E-Business
    Inscrit en
    Octobre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 33
    Points : 21
    Points
    21
    Par défaut
    Je te remercie pour toutes ces explications j'ai enfin réussi à créer mon formulaire et enregistrer mes données en BDD !

    Encore une question si tu le veux bien.
    Mes heures sont en format Datetime (ce qui me va bien pour ensuite faire des calculs entre ces heures) mais comment pourrais-je avoir un format HH:MM dans mon input suivant pour que l'utilisateur ne soit pas perdue mais que en base de données je récupère bien la date et l'heure correspondant à la date de travail ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <input type="time" name="Heuresselections[@i].HeureFin" value="@Model[i].heuredefin" />

  16. #16
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2013
    Messages : 29
    Points : 40
    Points
    40
    Par défaut
    Deux choses :
    Soit le type "time" du champ input, c'est de l'HTML5, pas possible sur tous les navigateurs, Google Chrome est bien en avance sur ça.
    Soit, tu fais deux champs select, l'un pour l'heure avec 24 valeurs (0-23), l'autre pour les minutes avec 60 (0-59) valeurs, tu récupères les deux champs dans deux variables différentes.
    Arrivé dans ton controller, tu peux recomposer le DateTime avec la date du jour et tes deux entiers pour l'heure et les minutes
    Constructeur de DateTime : https://msdn.microsoft.com/fr-fr/lib...v=vs.110).aspx
    Et pour la date du jour : https://msdn.microsoft.com/fr-fr/lib...v=vs.110).aspx
    Que tu peux décomposé en DateTime.Today.Year, DateTime.Today.Month et DateTime.Today.Day.

  17. #17
    Membre à l'essai
    Homme Profil pro
    Consultant E-Business
    Inscrit en
    Octobre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 33
    Points : 21
    Points
    21
    Par défaut
    Merci pour ta réponse.

    J'avais aussi penser à faire cela et donc créer 2 objets int pour saisir les Heures puis les minutes mais le problème est la mise en forme du formulaire.
    En effet, sur ce formulaire les personnes auront à saisir environ 6 heures pour une journée, donc 6*2 input (je n'avais pas tout mis initialement dans mon modèle de départ).

    Du coup je n'arrive pas à mettre en page les zones de saisie heure et minute l'une à coté de l'autre pour que l'utilisateur est la sensation de saisir une seule heure complète.

    Pour le moment, c'est vraiment illisible et l'utilisateur aura l'impression que les heures et les minutes n'ont rien à voir ensemble.

    Je manque énormément de pratique sur la mise en page aurais-tu une idée ?

  18. #18
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2013
    Messages : 29
    Points : 40
    Points
    40
    Par défaut
    Tu n'étais pas partis pour tout mettre dans un tableau au départ ?
    Pour la déco, regarde sur internet des exemples de formulaire qui pourra t'inspirer.

    Sinon, je pense que l'on a fait le tour du sujet de la discutions , non ?
    Si ton problème est résolu, n'oublie pas de le noter la discussion comme résolue.

  19. #19
    Membre à l'essai
    Homme Profil pro
    Consultant E-Business
    Inscrit en
    Octobre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant E-Business
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 33
    Points : 21
    Points
    21
    Par défaut
    Effectivement je pense avoir suffisamment abusé de ton temps.

    Merci pour ton aide.

    ptite-ratte

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 06/10/2023, 16h10
  2. [MySQL] Afficher le résultat d'une sélection dans deux listes déroulantes d'un formulaire
    Par ritouthai dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 28/09/2013, 09h14
  3. Réponses: 5
    Dernier message: 17/10/2007, 18h17
  4. Réponses: 1
    Dernier message: 15/06/2007, 22h28
  5. [MySQL] requête à partir de la sélection de ma liste déroulante
    Par wail00 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 07/05/2007, 16h00

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