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 :

[MVC5] Récupérer id/name du submit dans le controleur


Sujet :

ASP.NET MVC

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut [MVC5] Récupérer id/name du submit dans le controleur
    Bonjour à tous,

    Je dois faire un jeu basé sur un questionnaire, des questions et des réponses.

    Dans le référentiel que j'ai choisi :
    - 1 Questionnaire = 10 Questions
    - 1 Question = 4 Réponses

    Mon problème est le suivant :
    Mon Controller "Jeu" appelle une View "Question".
    Elle lui passe un ViewModel JeuVM

    J'aimerais que les 4 réponses s'affichent à la manière d'un bouton ou submit.
    Au clic d'un des boutons, j'aimerais que mon Controlleur "Jeu" récupére la réponse du bouton/submit.

    J'ai pensé à ajouter un id aux submit, mais je n'arrive pas à récupéré l'id/name de celui qui a envoyé été utilisé

    Ci-après les codes concernés

    ViewModel : JeuViewModel.cs
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class JeuViewModel
        {
            public string Nickname { get; set; }
            public int Points { get; set; }
            public Questionnaire Questionnaire { get; set; } // Questionnaire en cours
            public int NumQuestion { get; set; } // Numéro de la Question
            public Question Question { get; set; } // Question en cours
            public List<Reponse> Reponses { get; set; } // Liste des 4 réponses à la question.
    }
    Vue : Question.cshtml
    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
     
    @model ProjectWays.ViewModels.JeuViewModel
    @{
        ViewBag.Title = "Question " + Model.NumQuestion;
    }
     
    <h2>Question @Model.NumQuestion</h2>
     
    @using (Html.BeginForm("Question", "Jeu"))
    {
        @Html.AntiForgeryToken()
     
        <div class="form-horizontal">
            @Html.ValidationSummary(true, "", new { @class = "text-danger" })
     
            @Html.HiddenFor(model => model.Nickname)
            @Html.HiddenFor(model => model.NumQuestion)
            @Html.HiddenFor(model => model.Points)
            @Html.HiddenFor(model => model.Questionnaire.IdQuestionnaire)
            @Html.HiddenFor(model => model.Questionnaire.Libelle)
            @Html.HiddenFor(model => model.Question.IdQuestion)
            @Html.HiddenFor(model => model.Question.Libelle)
     
            <div class="form-group">
                <div class="col-md-10">
                    <p>
                        @Html.DisplayFor(model => model.Question.Libelle, new { @class = "control-label col-md-2" })
                    </p>
                </div>
            </div>
     
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <button type="submit" class="btn btn-default">
                        @Model.Reponses[0].Libelle
                    </button>
                    <button type="submit" class="btn btn-default">
                        @Model.Reponses[1].Libelle
                    </button>
                </div>
            </div>
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <button type="submit" class="btn btn-default">
                        @Model.Reponses[2].Libelle
                    </button>
                    <button type="submit" class="btn btn-default">
                        @Model.Reponses[3].Libelle
                    </button>
                </div>
            </div>
        </div>
    }
    Controller : Jeu
    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
     
    public class JeuController : Controller
        {
            private iDAL dal = new DAL();
     
            [. . .]
     
            [HttpPost, ActionName("Question")]
            public ActionResult QuestionPost(JeuViewModel jeuVM)
            {
                int rep = 0; // recup id de la réponse ou du submit ???
                jeuVM.Points += jeuVM.Reponses[rep].Points;
                jeuVM.NumQuestion += 1;
                jeuVM.Question = dal.getQuestionsByIdQuestionnaire(jeuVM.Questionnaire.IdQuestionnaire)[jeuVM.NumQuestion - 1];
                jeuVM.Reponses = dal.getReponsesByIdQuestion(jeuVM.Question.IdQuestion);
     
                if (jeuVM.NumQuestion > 10)
                    return View("Resultat", jeuVM); ;
                return View(jeuVM);
            }
    }

  2. #2
    Responsable .NET

    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Points : 252 372
    Points
    252 372
    Billets dans le blog
    121
    Par défaut
    Il y a différentes approches pour gérer cela. La plus simple serait de donner le même nom à l'ensemble de tes boutons submit, et de spécifier des valeurs différentes pour chacun :


    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
     
     
    @model ProjectWays.ViewModels.JeuViewModel
    @{
        ViewBag.Title = "Question " + Model.NumQuestion;
    }
     
    <h2>Question @Model.NumQuestion</h2>
     
    @using (Html.BeginForm("Question", "Jeu"))
    {
        @Html.AntiForgeryToken()
     
        <div class="form-horizontal">
            @Html.ValidationSummary(true, "", new { @class = "text-danger" })
     
            @Html.HiddenFor(model => model.Nickname)
            @Html.HiddenFor(model => model.NumQuestion)
            @Html.HiddenFor(model => model.Points)
            @Html.HiddenFor(model => model.Questionnaire.IdQuestionnaire)
            @Html.HiddenFor(model => model.Questionnaire.Libelle)
            @Html.HiddenFor(model => model.Question.IdQuestion)
            @Html.HiddenFor(model => model.Question.Libelle)
     
            <div class="form-group">
                <div class="col-md-10">
                    <p>
                        @Html.DisplayFor(model => model.Question.Libelle, new { @class = "control-label col-md-2" })
                    </p>
                </div>
            </div>
     =
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <button type="submit" class="btn btn-default" name="submit" value="0">
                        @Model.Reponses[0].Libelle
                    </button>
                    <button type="submit" class="btn btn-default" name="submit" value="1">
                        @Model.Reponses[1].Libelle
                    </button>
                </div>
            </div>
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <button type="submit" class="btn btn-default" name="submit" value="2">
                        @Model.Reponses[2].Libelle
                    </button>
                    <button type="submit" class="btn btn-default" name="submit" value="3">
                        @Model.Reponses[3].Libelle
                    </button>
                </div>
            </div>
        </div>
    }

    Et puis dans ton contrôleur tu peux récupérer la valeur du submit. Seule la valeur du submit sur lequel l'utilisateur à cliquer sera transmise.

    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
     
     
    public class JeuController : Controller
        {
            private iDAL dal = new DAL();
     
            [. . .]
     
            [HttpPost, ActionName("Question")]
            public ActionResult QuestionPost(JeuViewModel jeuVM, string submit)
            {
     
                jeuVM.Points += jeuVM.Reponses[int.Parse(submit)].Points;
                jeuVM.NumQuestion += 1;
                jeuVM.Question = dal.getQuestionsByIdQuestionnaire(jeuVM.Questionnaire.IdQuestionnaire)[jeuVM.NumQuestion - 1];
                jeuVM.Reponses = dal.getReponsesByIdQuestion(jeuVM.Question.IdQuestion);
     
                if (jeuVM.NumQuestion > 10)
                    return View("Resultat", jeuVM); ;
                return View(jeuVM);
            }
    }
    Vous souhaitez participer aux rubriques .NET ? Contactez-moi

    Si déboguer est l’art de corriger les bugs, alors programmer est l’art d’en faire
    Mon blog, Mes articles, Me suivre sur Twitter
    En posant correctement votre problème, on trouve la moitié de la solution

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Problème de récupération de ViewModel ?
    Bonjour,

    merci de votre réponse , j'arrive bien à récupérer la valeur du bouton cliqué.

    Cependant, j'ai une autre erreur qui se forme (ou qui était déjà là avant, faute de tests)

    Avant la question 1 le controller passe bien dans une méthode "Commencer" avec le JeuVM.NumQuestion initialisé à 1 et appelle la méthode "Question" en passant JeuVM en paramètre.
    La vue m'affiche bien "Question 1".
    À la réponse de la question 1, le controller passe dans la méthode "QuestionPost" et mets le JeuVM.NumQuestion à 2 (entre autres choses) et appelle de nouveau la méthode "Question" en passant JeuVM (qui a été modifié) en paramètre.
    La vue m'affiche bien "Question 2".
    À la réponse de la question 2 (même chose que pour la 1), le controller passe dans la méthode "QuestionPost" et mets le JeuVM.NumQuestion à 2 (entre autres choses) et appelle de nouveau la méthode "Question" en passant JeuVM (qui a été modifié) en paramètre.
    Et là, la vue m'affiche de nouveau "Question 2"

    Je ne comprends pas pourquoi la vue récupère le JeuVM de base, et pas celui modifié =/

    Des idées ?

    Je mets ci-joint les autres méthodes de mon JeuController ainsi que la vue d'index, même si je ne pense pas qu'elles soient en cause

    Controller : JeuController
    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
     
    public class JeuController : Controller
        {
            private iDAL dal = new DAL();
     
            public ActionResult Index()
            {
                ViewBag.AllQuestionnaires = dal.getAllQuestionnairesInSelectList(null);
                JeuViewModel jvm = new JeuViewModel()
                {
                    Nickname = ""
                };
                return View(jvm);
            }
     
            public ActionResult Commencer(JeuViewModel jeuVM)
            {
                if (ModelState.IsValid)
                {
                    int selected = 0;
                    int.TryParse(Request.Form["AllQuestionnaires"].ToString(), out selected);
     
                    jeuVM.IdQuestionnaire = selected;
                    jeuVM.Points = 300;
                    jeuVM.NumQuestion = 1;
                    jeuVM.Question = dal.getQuestionsByIdQuestionnaire(jeuVM.IdQuestionnaire)[jeuVM.NumQuestion - 1];
                    jeuVM.Reponses = dal.getReponsesByIdQuestion(jeuVM.Question.IdQuestion);
     
                    return View("Question", jeuVM);
                }
     
                return View(jeuVM);
            }
     
            public ActionResult Question (JeuViewModel jeuVM)
            {
                return View(jeuVM);
            }
     
            [HttpPost, ActionName("Question")]
            public ActionResult QuestionPost(JeuViewModel jeuVM, string submit)
            {
                jeuVM.Points += jeuVM.Reponses[int.Parse(submit)].Points;
                jeuVM.NumQuestion += 1;
                jeuVM.Question = dal.getQuestionsByIdQuestionnaire(jeuVM.IdQuestionnaire)[jeuVM.NumQuestion];
                jeuVM.Reponses = dal.getReponsesByIdQuestion(jeuVM.Question.IdQuestion);
     
                if (jeuVM.NumQuestion > 10)
                    return View("Resultat", jeuVM);
     
                return View(jeuVM);
            }
     
            public ActionResult Resultat(JeuViewModel jeuVM)
            {
                return View(jeuVM);
            }
        }

    View : Index
    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
     
    @model ProjectWays.ViewModels.JeuViewModel
     
    @{
        ViewBag.Title = "Index";
    }
     
    <h2>Project Ways</h2>
     
    @using (Html.BeginForm("Commencer", "Jeu"))
    {
        @Html.AntiForgeryToken()
     
        <div class="form-horizontal">
            @Html.ValidationSummary(true, "", new { @class = "text-danger" })
            <div class="form-group">
                <div class="col-md-10">
                    <p>
                        Bienvenue dans l'application PROJECT WAYS.<br />
                        Ici, vous pourrez être guidé vers un métier tout en vous amusant !<br />
                        Commencez par Choisir votre pseudonyme<br />
                        (Aucune information personnelle ne sera conservée, sachez que ce pseudonyme servira pour le classement final uniquement)
                    </p>
                </div>
            </div>
            <div class="form-group">
                @Html.LabelFor(model => model.Nickname, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.EditorFor(model => model.Nickname, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.Nickname, "", new { @class = "text-danger" })
                </div>
            </div>
            <div class="form-group">
                <div class="col-md-10">
                    <p>
                        Veuillez maintenant choisir le questionnaire auquel vous voulez répondre
                    </p>
                </div>
            </div>
            <div class="form-group">
                @Html.Label("Questionnaire", htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.DropDownList("AllQuestionnaires", "Select a Questionnaire")
                    @Html.ValidationMessage("Test 1", "", new { @class = "text-danger" })
                </div>
            </div>
     
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Commencer" class="btn btn-default" />
                </div>
            </div>
        </div>
    }

  4. #4
    Responsable .NET

    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Points : 252 372
    Points
    252 372
    Billets dans le blog
    121
    Par défaut
    Ça ma l'air correct. Il doit avoir quelque chose de mal faite quelque part. Essayes de faire une exécution pas à pas pour vérifier le contenu de tes variables et identifier ou ça coince.
    Vous souhaitez participer aux rubriques .NET ? Contactez-moi

    Si déboguer est l’art de corriger les bugs, alors programmer est l’art d’en faire
    Mon blog, Mes articles, Me suivre sur Twitter
    En posant correctement votre problème, on trouve la moitié de la solution

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Dans la méthode "Question" de mon contrôleur "JeuController", la variable jeuVM n'est pas bien récupérée, puisqu'à l'envoie du submit, le "jeuVM" récupéré est faux.
    Du coup, la vue affiche bien ce qu'on lui envoie.
    Nom : Capture.PNG
Affichages : 1775
Taille : 11,9 Ko


    Y aurait-il un moyen pour que je puisse montrer mon code et son exécution en direct ? du genre par skype/teamviewer ?

    J'avouerais honnêtement que je ne code pas en C# .net depuis très longtemps et que ça dépasse mes capacités à débuger =/

    Merci d'avance.

  6. #6
    Responsable .NET

    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Points : 252 372
    Points
    252 372
    Billets dans le blog
    121
    Par défaut
    Peux-tu poster deux captures d’écran de JeuxVM en mettant un point d’arrêt sur le if dans la méthode d'action QuestionPost ?

    Et tu spécifie également les valeurs qui étaient réellement attendues pour ces deux cas.
    Vous souhaitez participer aux rubriques .NET ? Contactez-moi

    Si déboguer est l’art de corriger les bugs, alors programmer est l’art d’en faire
    Mon blog, Mes articles, Me suivre sur Twitter
    En posant correctement votre problème, on trouve la moitié de la solution

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Voici la pile d'appel :

    - Controller : Index
    - View : Index (Choix Nickname & idQuestionnaire de JeuVM)
    - Controller : Commencer (Initialise le Nickname et idQuestionnaire grace aux données de la View, initialise Points à 0, va chercher la 1ère question du questionnaire ainsi que ses réponses)
    - View : Question (Choix réponse)
    Nom : Capture_1.PNG
Affichages : 1719
Taille : 7,3 Ko
    - Controller : QuestionPost (Récupère JeuVM, ajoute les points de la réponse, passe à la question suivante, va chercher les réponses de la question suivante)
    JeuVM récupéré (image 1.1) OK
    Nom : Capture_1.1.PNG
Affichages : 1751
Taille : 32,2 Ko
    JeuVM envoyé (image 1.2) OK
    Nom : Capture_1.2.PNG
Affichages : 1736
Taille : 32,0 Ko
    - View : Question (Choix réponse)
    Nom : Capture_2.PNG
Affichages : 1679
Taille : 7,7 Ko
    - Controller : QuestionPost
    JeuVM récupéré (image 2.1) KO
    Nom : Capture_2.1.PNG
Affichages : 1644
Taille : 32,3 Ko
    JeuVM Envoyé (image 2.2) KOK (le traitement est OK par rapport au récupéré mais KO par rapport à ce qu'il devrait être si le 2.1 avait été correct)
    Nom : Capture_2.2.PNG
Affichages : 1728
Taille : 31,9 Ko

    L'image 2.1 devrait être exactement la même que l'image 1.2. La seule chose qui devrait être modifié c'est le submit,
    Par déduction, on peut voir que le jeuVM est bien envoyé, mais mal récupéré

    serait-il possible de contourner le problème en mettant une variable globale au Controller ? et de modifier cette variable ?

    (J'ai modifié mes screens pour que ce soit plus clair, mais je n'ai pas réussi à supprimer les anciens.
    Ne pas tenir compte des screens en PJ mais utiliser ceux dans le message)
    Images attachées Images attachées     

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/10/2014, 15h36
  2. Réponses: 21
    Dernier message: 16/05/2012, 10h54
  3. Comment récupérer l'index du curseur dans une TStringGrid ?
    Par Sydaze dans le forum Composants VCL
    Réponses: 2
    Dernier message: 26/04/2005, 09h17
  4. [Portal] Submit dans un portlet
    Par nic211 dans le forum Oracle
    Réponses: 9
    Dernier message: 07/07/2004, 18h37
  5. Réponses: 5
    Dernier message: 07/07/2004, 15h13

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