[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:
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:
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:
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);
}
} |
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:
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:
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>
} |