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 :

Gestion de plusieurs formulaires dans une même vue [Débutant]


Sujet :

ASP.NET MVC

  1. #1
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut Gestion de plusieurs formulaires dans une même vue
    Bonjour,

    je conçois une application de type formulaire de saisie de dossier. j'ai découpé mon dossier en 4 sections donc 4 formulaires que je souhaite rendre autonome pour ne pas à avoir à remplir tout le dossier d'un seul coup pour l'enregistrer.

    j'ai lu
    In an MVC view, you can have as many forms with as many fields as you need. To keep it simple, use a single view model with all the properties you need on the page for every form.
    donc j'applique.

    j'utilise un systeme d'onglet (jquery) pour segmenter mon dossier. à chaque onglet correspond une vue partielle donc un formulaire. J'ai donc une vue principale composée de tous mes champs de tous mes formulaires ( 4 vues partielles + propriétés communes à chacun des mes sous modèles (Id du candidat par exemple).

    je prévois autant action qu'il y aura de formulaire en exploitant le model principal dans mon contrôleur.


    à présent et mon soucis est là lorsque j'analyse mes données (model) que je récupère dans mes actions correspondant à la validation de mes formulaires seuls les attributs du formulaire sont renseignés les autres sont nuls.

    quelle est la bonne facon de faire

    merci à vous

  2. #2
    Membre actif
    Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 127
    Points : 288
    Points
    288
    Par défaut
    Bonjour,
    Qu'est-ce que tu entends par :

    Citation Envoyé par shaun_the_sheep Voir le message
    seuls les attributs du formulaire sont renseignés les autres sont nuls.

  3. #3
    Membre actif
    Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 127
    Points : 288
    Points
    288
    Par défaut
    Sinon voilà une solution possible : http://stackoverflow.com/questions/1...rm-mvc-web-app

  4. #4
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut
    bien mon model contient tous mes champs de tous mes formulaires , seul les attributs du form validé sont renseignés dans l'objet model que que je récupère dans la méthode du controleur qui correspond à l'action de validation de mon formualire
    .
    comme je redirige vers ma page principal tous mes champs de tous mes formulaires sont vides sauf ce que je viens de valider.

    le lien donne comme idée :
    You could create one ViewModel class that each page uses (strongly typed view) and just store the fields that aren't being edited in hidden fields
    je souhaite éviter les champs masqués , il n'y a pas une autre solution ?

    est ce que je peux passer des paramètres au contrôleur lorsque je valide mon formulaire ?

  5. #5
    Membre actif
    Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 127
    Points : 288
    Points
    288
    Par défaut
    Si tu ne veux pas passer par des champs cachés tu peux conserver ton objet en session (comme dans cet exemple) :
    http://www.c-sharpcorner.com/UploadF...-mvc-5-part-1/

  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 : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Sinon tu peux aussi gerer ton formulaire "manuellement", via jQuery et lors du click sur le bouton submit, tu postes vers ton controller. Ensuite libre a toi ou non de conserver le model dans la session le temps du traitement. Ca donne un peu plus de liberte par rapport aux automatismes d'ASP.NET MVC. Ces derniers sont parfaits et font gagner un temps fou pour des scenarios relativement simples, mais ils ne sont pas toujours adaptes.
    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
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut
    Bonjour,

    Merci je vais regarder cette piste

  8. #8
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut
    j'ai modifié ma vue partielle ainsi :

    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
     
    ......
    @section PageScripts
    {      
        <script type="text/javascript">
     
              $('form').submit(function () {
                 var serializedForm = $(this).serialize();
                 $.ajax({
                    url: '@Url.Action("SubmitInterShipProperties")',
                    type: "POST",
                    data: serializedForm,
                    success: function (result) {
     
                        alert("success ");
                    },
                    error: function (result) {
                        alert("Failed");
                    }
     
                });
                  return false;
              });
        </script>
    }
     
     
    @using (Html.BeginForm("SubmitInterShipProperties", "Home"))
    {
        @Html.ValidationSummary(true)
     
        <fielset>
     
            <legend>Stage :</legend>
            @Html.ValidationSummary(true, "ValidationSummary")  
            <div class="editor-label">
            @Html.Label("Sujet du Stage :")   
            </div> 
            <div class="editor-field">
            @Html.TextBoxFor(u => u.internShipViewModel.titre_stage, new { @class = "form-control" })    
            @Html.ValidationMessageFor(model => model.internShipViewModel.titre_stage)
            </div> 
     
            <div>
                         @Html.Label("Type d'activité :")   
                @Html.DropDownListFor( u => u.intshp_activity,Model.intshp_activityList, new { @class = "form-control" } )    
            </div>   
     
            <div class="editor-field">
                <input id="submitButton" type="submit" value="Submit" />
            </div>
     
         </fielset>
    }
    Mon contrôleur devient :
    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
     
            [HttpPost]
            public ActionResult SubmitInterShipProperties(InternShipIndexViewModel internShipIndexViewModel)
            {
     
               // Do something with contactInfo
     
                if (ModelState.IsValid)
                {
     
                }
                else
                {
     
                }
                return Json(internShipIndexViewModel);
            }

    Mon modèle reste inchangé:

    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 class InternShipIndexViewModel
        {        
            public string student_id { get; set; }
     
            public IEnumerable<SelectListItem> intshp_activityList { get; set; }
            public string intshp_activity { get; set; }
     
            public IEnumerable<SelectListItem> type_addressList { get; set; }
            public IEnumerable<SelectListItem> countryList { get; set; }
            public IEnumerable<SelectListItem> Industry_branchListe { get; set; }
            public IEnumerable<SelectListItem> Ape_numberListe { get; set; }
     
     
            public InternShipEntityViewModel internShipEntityViewModel { get; set; }
            public InternShipViewModel internShipViewModel { get; set; }
     
        }
    Le model InternShipIndexViewModel que je récupère dans mon controleur n'a toujours que les attributs du forms validés de renseignés
    soit internShipViewModel .

    ma page n’étant pas rechargée par ce mécanisme pas de soucis pour mes listes de valeurs. (IEnumerable).

    j'ai un soucis majeure : un pop apres le submit s'affiche en jaune me demandant si je veux enregistrer un fichier json.
    puis si je comprend bien je dois gérer moi meme les erreurs ?

    les balises [StringLength(120)] ou [Required(ErrorMessage = "This field is required.")] ne sont plus exploités ?

    merci de votre aide

  9. #9
    Membre actif
    Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 127
    Points : 288
    Points
    288
    Par défaut
    Le model InternShipIndexViewModel que je récupère dans mon controleur n'a toujours que les attributs du forms validés de renseignés
    soit internShipViewModel
    C'est normal, c'est pour ça que je te proposais de mettre à chaque step les valeurs en session.

  10. #10
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut
    je viens de mettre en place ton idée:

    soit

    dans la 1iere méthode appelée dans le controleur, je stocke une 1ier fois mon objet en session
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //Session
    Session["datasModelsS"] = internShipIndexViewModel;
    puis dans une méthode de submit
    je récupère mon objet de ma session et je fais les replacements pou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    InternShipIndexViewModel datasModelsS = new InternShipIndexViewModel();
    datasModelsS = Session["datasModelsS"] as InternShipIndexViewModel;
    datasModelsS.internShipViewModel = internShipIndexViewModel.internShipViewModel;
    Session["datasModelsS"] = datasModelsS;
    ....
    return View("Start", datasModelsS);
    j'ai rien modifié coté Vue.
    j'arrive au résultat voulu

    par contre vous me confirmez bien que la session est bien propre à l'instance d’exécution courante et qu'un autre user autre sa propre session ?

  11. #11
    Membre actif
    Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 127
    Points : 288
    Points
    288
    Par défaut
    Ok super
    La session est stockée côté serveur mais chaque utilisateur va recevoir un cookie de session. Ce cookie accompagne chaque requête du coup les informations "appartiennent" à l'utilisateur.

  12. #12
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut
    Ok après plusieurs de dév avec cette solution je la valide

  13. #13
    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 : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Ok par contre attention, car la session est quelque chose de tres volatile. Voici les principaux scenarios ou l'on peut perdre le contenu de la session :
    1 - Le serveur redemarre

    2 - L'Application Pool redemarre (se recycle):
    --- Par defaut toutes les 1740 min, soit 1 fois par jour - en general tu ne sais jamais exactement quand car ca peut aussi se recycler :
    --- Apres le deploiement d'une nouvelle version du site
    --- En cas de modification du fichier web.config
    --- En cas de modification du repertoire \Bin
    --- ...

    3 - Si tu es dans le cloud, ton site peut etre transfere de machine en machine (a chaud). Une fois bascule sur le nouveau serveur, le contenu de la session sera perdu.

    4 - Si tu es sur une ferme de serveurs, au debut de la navigation de l'utilisateur le load balancer lui assigne une affinite. Ce cookie permet en theorie de s'assurer que les requetes de l'utilisateur seront toujours traitees par le meme serveur. Cependant si pour une raison X ou Y le serveur est down, ou il y a un problem reseau qui l'empeche de recevoir les requetes, le load balancer va rediriger ces requetes vers un autre serveur et emettre un autre cookie d'affinite. Suite a cette bascule, le contenu de la session sera egalement perdu.

    Pour assurer une persistence on peut utiliser des systemes tels que memcached ou redis, ou encore une base de donnees relationnelle ou NoSQL.

    A toi de voir s'il est acceptable ou non pour l'utilisateur de pouvoir perdre les infos de la session pendant qu'il navigue.
    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.

  14. #14
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut
    Bonjour

    Pour mon cas précis oui c'est pas grave , les paramétres de connexion de l'utilisateur sont déja en session

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

Discussions similaires

  1. [MVC Form] Plusieurs formulaires dans la même vue
    Par guste dans le forum ASP.NET MVC
    Réponses: 2
    Dernier message: 10/06/2010, 12h17
  2. Réponses: 7
    Dernier message: 05/02/2010, 18h55
  3. Plusieurs formulaires dans une seule servlet
    Par bf83 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 27/03/2006, 15h21
  4. TForm pour plusieurs fenêtre dans une même fonction ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 5
    Dernier message: 15/11/2005, 12h38
  5. [Applet]Utiliser plusieurs Applet dans une même classe
    Par BRAUKRIS dans le forum Applets
    Réponses: 5
    Dernier message: 11/06/2004, 15h27

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