2009-12-09 22 views
6

Ich habe eine MVC-Ansicht, die aus einer Matrix von Radio-Buttons. Jede Reihe von Optionsfeldern befindet sich in einer Gruppe und repräsentiert ein typisiertes Objekt aus dem Modell. Unter Verwendung der Anleitung verschiedener Blogs und Postings habe ich die Ergebnisse des geposteten Formulars erfolgreich an das typisierte Modell-Array in der Controller-Aktion gebunden, kann jedoch den Effekt nicht erfolgreich umkehren und ein vorhandenes Modell an die Optionsfelder binden, während der ausgewählte oder nicht ausgewählte Status beibehalten wird .ASP.NET MVC Zwei-Wege-Datenbindung des Modells zu Radiobutton-Liste mit typisierten Modell

Mein Modell enthält eine Eigenschaft namens "AnswerValue", die zwischen 0 und 4 liegt und mit den Radiobutton-Namen übereinstimmen sollte. Ich habe versucht, den Indexwert auf den Modellwert "AnswerId" zu ändern, aber dabei funktioniert die funktionierende Bindung nicht mehr (ich glaube, der Index muss auf Null basieren). Hier sind ein paar Ressourcen, die ich bisher verwendet habe Post und eine Article by Scott Hanselman zu bekommen, wo ich jetzt bin.

Wenn jemand irgendeinen Einblick hat, wie man diese Zweiwegbindung durchführt, würde es sehr geschätzt werden.

Dank

Mein Controller:

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

Meine Ansicht:

<% 
    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++; 
    } 
%> 

Antwort

6

Der Radiobutton selbst (in Bezug auf Zustand) als Wahr/Falsch keine Werte erkennen. Sie müssen also den Wert mit der tatsächlichen Position vergleichen und explizit den Zustand TRUE/FALSE setzen.

Versuchen Sie mit dieser Überladung des Radio Button Helper.

<%=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)%> 

Wenn Sie ein Ansichtsmodell verwenden, vielleicht ist es besser, diese Logik Frage zu stellen (q.AnswerValue == 4) direkt statt in der Ansicht drin.

PS: Ich denke, dass Sie die letzten Parameter als bereits ersten entfernen können die ID und die Namen atributes setzen auf: "SurveyAnswer[" + questionIndex + "].AnswerValue"

+1

Wenn ich Entity Framework und das erzeugte Einheit Set verwenden, was eine gute Methode zur Erweiterung wäre Dies um Ihre empfohlene Logik zu halten. Danke für die Hilfe bis jetzt. Scheint zu arbeiten. – Jeremy

+0

Wenn Sie kein ViewModel-Muster verwenden, ist es vielleicht besser, es so zu belassen, weil es eine Änderung der Logik des Controllers, des betrachteten Modelltyps in der Ansicht und möglicherweise Ihrer Validierungsverfahren erfordert. Sie werden hauptsächlich verwendet, wenn Sie komplexe Modelle haben (wie 2 oder mehr Entity-Sets, die zu einem einzigen Formular kombiniert werden oder SelectedList/RadioButtons/..). Wenn Sie mehr von diesem Pattern sehen möchten, werfen Sie einen Blick auf http: // geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx oder der Abschnitt "Using a ViewModel Pattern" von ScottGu in seinem ASP.NET MVC 1.0 Buch. – JOBG