2009-12-09 6 views
6

J'ai une vue mvc composée d'une matrice de boutons radio. Chaque rangée de boutons radio est dans un groupe et représente un objet typé du modèle. En utilisant les conseils de divers blogs et publications, j'ai lié avec succès les résultats de formulaire affichés au tableau de modèles tapé dans l'action du contrôleur, mais je n'arrive pas à inverser l'effet et à lier un modèle existant aux boutons radio tout en conservant leur état sélectionné ou non sélectionné .Liaison de données ASP.NET MVC bidirectionnelle d'un modèle vers une liste de boutons radio en utilisant le modèle dactylographié

Mon modèle contient une propriété appelée "AnswerValue" qui est comprise entre 0 et 4 et doit correspondre aux noms de radiobutton. J'ai essayé de changer la valeur d'index à la valeur de modèle "AnswerId" mais en faisant ainsi la liaison qui fonctionnait ne fonctionne plus (je crois que l'index doit être basé sur zéro). Voici quelques ressources que j'ai utilisées jusqu'à présent: Post et Article by Scott Hanselman pour arriver où je suis maintenant.

Si quelqu'un a un aperçu sur la façon d'effectuer cette liaison à deux voies, il serait très apprécié.

Merci

Mon contrôleur:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Save([Bind(Prefix = "SurveyAnswer")] SurveyAnswer[] responses, int SurveyID) 
    { 

Mon Vue:

<% 
    int questionIndex = 0; 
    foreach (SurveyAnswer q in Model) 
    { 

%> 
    <%=Html.Hidden("SurveyAnswer.Index", questionIndex)%> 
    <%=Html.Hidden("SurveyAnswer["+questionIndex+"].AnswerId", q.AnswerId) %> 
    <tr> 
    <td style='background-color: #aaaaaa;padding-left: 10px; padding-right: 10px;border-right: solid 1px #fffff;'><%= questionIndex+1 %></td> 
    <td style='text-align: right;'><%= q.Question.DisplayValue %></td> 
    <td><%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "0", new { name = "SurveyAnswer[" + questionIndex + "].AnswerValue"})%></td> 
    <td><%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "1", new { name = "SurveyAnswer[" + questionIndex + "].AnswerValue" })%></td> 
    <td><%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "2", new { name = "SurveyAnswer[" + questionIndex + "].AnswerValue" })%></td> 
    <td><%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "3", new { name = "SurveyAnswer[" + questionIndex + "].AnswerValue"})%></td> 
    <td><%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "4", new { name = "SurveyAnswer[" + questionIndex + "].AnswerValue" })%></td> 
    </tr> 
<% 
    questionIndex++; 
    } 
%> 

Répondre

6

Le bouton radio lui-même ne reconnaît pas les valeurs (en termes d'état) autres que Vrai/Faux. Vous devrez donc comparer la valeur avec la position réelle et définir explicitement l'état TRUE/FALSE. Essayez avec cette surcharge de l'aide de bouton radio.

<%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "0", q.AnswerValue == 0)%> 
<%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "1", q.AnswerValue == 1)%> 
<%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "2", q.AnswerValue == 2)%> 
<%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "3", q.AnswerValue == 3)%> 
<%=Html.RadioButton("SurveyAnswer[" + questionIndex + "].AnswerValue", "4", q.AnswerValue == 4)%> 

Si vous utilisez un ViewModel, peut-être il est préférable de poser cette question logique (q.AnswerValue == 4) là au lieu de directement dans la vue.

PS: Je pense que vous pouvez supprimer le dernier paramètre que le premier définit déjà les atributs d'identité et le nom de: "SurveyAnswer[" + questionIndex + "].AnswerValue"

+1

Si j'utilise le cadre de l'entité et l'entité générée ensemble de, ce qui serait une bonne méthode pour l'extension ceci pour maintenir votre logique recommandée. Merci du coup de main jusqu'à présent. Ça semble fonctionner. – Jeremy

+0

Si vous n'utilisez pas un pattern ViewModel, il est peut-être préférable de le laisser comme ça, car cela impliquera de changer la logique du contrôleur, le type de modèle spectateur à la vue et peut-être vos procédures de validation. Ils sont principalement utilisés lorsque vous avez des modèles complexes (comme 2 ensembles d'entités ou plus combinés dans un seul formulaire ou pour configurer SelectList/RadioButtons/..), si vous voulez jeter un coup d'œil à ce modèle regardez http: // geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx ou la section "Utilisation d'un modèle ViewModel" par ScottGu dans son livre ASP.NET MVC 1.0. – JOBG

Questions connexes