MVC 4 les valeurs de certains boutons radio
Je suis juste de s'aventurer dans le monde de la MVC (v4) et je vais avoir vraiment du mal à obtenir de réelles valeurs sélectionnées de la liste des radiobutton listes. Je suis en tirant les données à partir d'un Umbraco base de données (mais je suppose que le principe de ce que je suis en train de le faire sera de même) où il ya la liste des questions à chaque question en ayant une liste de réponses. Je vais poster tout ce que j'ai fait jusqu'à présent dans l'espoir que quelqu'un de plus intelligent que j'ai pu me pointer dans la bonne direction:
Voici ma structure de contenu
Mon Modèle
namespace ICASolution.Models
{
public class MultipleChoiceViewModel
{
public int iQuestionID { get; set; }
public string zQuestionTitle { get; set; }
public string zQuestionText { get; set; }
public List<Answers> lAnswers { get; set; }
}
public class Answers
{
public int iAnswerID { get; set; }
public string zAnswerText { get; set; }
public bool bCorrect { get; set; }
public string selectedAnswer { get; set; }
}
}
Ma surface de contrôleur:
namespace ICASolution.Controllers
{
public class MultipleChoiceSurfaceController : SurfaceController
{
//
//GET: /MultipleChoiceSurface/
//public ActionResult Index()
//{
// return PartialView("MultipleChoice", new MultipleChoiceViewModel());
//}
[HttpPost]
public ActionResult Grade(MultipleChoiceViewModel model)
{
return RedirectToCurrentUmbracoPage();
}
public ActionResult Index()
{
var TestPage = Umbraco.Content(CurrentPage.Id);
var questions = new List<MultipleChoiceViewModel>();
foreach (var child in TestPage.Children)
{
var questionid = child.Id;
var questiontitle = child.GetPropertyValue("questionTitle");
var questiontext = child.GetPropertyValue("questionText");
questions.Add(new MultipleChoiceViewModel { iQuestionID = questionid, zQuestionTitle = questiontitle, zQuestionText = questiontext, lAnswers = answerList(questionid) });
}
return PartialView("MultipleChoice", questions);
}
public List<Answers> answerList(int iMyQuestionID)
{
var questionPage = Umbraco.Content(iMyQuestionID);
var answers = new List<Answers>();
foreach(var child in questionPage.Children)
{
answers.Add(new Answers { iAnswerID = child.Id, zAnswerText = child.GetPropertyValue("answerTitle"), bCorrect = child.GetPropertyValue("correctAnswer") });
}
return answers;
}
}
}
et enfin mon partiel:
@model IEnumerable<ICASolution.Models.MultipleChoiceViewModel>
<div class="ethicsTestContainer">
<div class="col-md-12">
<div class="col-md-12 noRPadding">
@using (Html.BeginUmbracoForm<ICASolution.Controllers.MultipleChoiceSurfaceController>("Grade")) {
foreach (var item in Model)
{
<div class="form-group">
<p><strong>@item.zQuestionTitle</strong></p>
<p>@item.zQuestionText</p>
@{
foreach (var answerItem in item.lAnswers)
{
<div class="radio radio-danger">
@Html.RadioButton(answerItem.iAnswerID.ToString(), answerItem.iAnswerID, new { @type = "radio", @id = answerItem.iAnswerID, @name = item.iQuestionID })
@*<input type="radio" name="@item.iQuestionID" id="@answerItem.iAnswerID" value="option1">*@
<label for="@answerItem.iAnswerID">
@answerItem.zAnswerText <span> </span>@answerItem.bCorrect
</label>
</div>
}
}
</div>
}
<div class="col-sm-8 col-sm-push-2">
<button type="submit" class="btn btn-default btn-block">CLICK HERE TO COMPLETE YOUR ETHICS TEST</button>
</div>
}
</div>
</div>
</div>
Tout rend très bien quand affichées à l'utilisateur:
Mais je ne peux pas travailler sur la façon d'obtenir les sélections de l'utilisateur sur le HTTPPOST (en gros j'ai besoin de compter la quantité de réponses correctes qu'ils ont fait).
Vous devez vous connecter pour publier un commentaire.
Votre problème est que vous générez les contrôles pour
MultipleChoiceViewModel
dans unforeach
boucle génère doublename
attributs qui ne peut pas être lié à une collection (ils ne comprennent pas les indexeurs) et en doubleid
attributs qui n'est pas valide html. Vous avez besoin de générer les commandes dans unfor
boucle (ou utiliser unEditorTemplate
pour le type deMultipleChoiceViewModel
)Vous aussi besoin de se déplacer à la
selectedAnswer
propriétéMultipleChoiceViewModel
(pas dansselectedAnswer
)À l'aide d'un
for
boucle (le modèle doit êtreIList<MultipleChoiceViewModel>
)D'utiliser un
EditorTempate
, de créer une vue partielle en/Views/Shared/EditorTemplates
nomméMultipleChoiceViewModel.cshtml
puis dans la vue principale,remplacer le
for
boucle avecLa
EditorFor()
méthode permettra de générer de l'html basé sur le modèle pour chaque élément de la collection.Notes:
RadioButtonFor()
génèretype="radio"
l'ajout d'un code html pour@type = "radio"
est inutile. Et ne JAMAIS remplacer lename
attribut lors de l'utilisation de html helpersIList<MultipleChoiceViewModel>
(voir paragraphe 3). Si pour quelque raison vous ne pouvez pas le changer pourList<T>
ensuite, vous besoin d'utiliser unEditorTemplate
pour le type deMultipleChoiceViewModel
@model List<ICASolution.Models.MultipleChoiceViewModel>
je vais aussi mettre à jour ma réponse un peu plus tard pour montrer laEditorTemplate
option.List<MultipleChoiceViewModel>
(j'.e pour correspondre le modèle dans la vue, puis tout est lié (au moins tous les biens que vous avez rendu un contrôle de formulaire)[Required]
l'attribut de la propriétéselectedAnswer
et comprennent@Html.ValidationMessageFor(m => m[i].selectedAnswer)
- vous accédez alors à la fois côté client et serveur de validationVous pouvez créer les boutons de la radio à l'aide de code ci-dessous:
Et obtenir le bouton d'option sélectionné la valeur de code donné ci-dessous:
Dans le code ci-dessus est l'objet de FormCollection
Cela vous donne une chaîne de la radio sélectionnée bouton à partir d'un groupe.