2016-03-29 11 views
-1

Erhalten habe ich unten Modellstrukturausgewählte Radiobutton Werte in MVC

public class Quiz 
{ 
    public List<Question> Questions { get; set; } 
} 

public class Question 
{ 
    public int Id { get; set; } 
    public String QuestionText { get; set; } 
    public List<Option> Options { get; set; } 
    public int AnswerId { get; set; } 
} 

public class Option 
{ 
    public int Id { get; set; } 
    public String OptionText { get; set; } 
    public int DisplayOrder { get; set; } 
} 

Und meiner Meinung nach ist wie unten, wo ich alle Fragen und Optionen

foreach (var question in Model.Questions) 
{ 
    @Html.DisplayFor(modelItem => question.QuestionText) <br /> 
    foreach (var option in question.Options) 
    { 
     @Html.RadioButton("Id", option.Id)@option.OptionText 
    } 
} 
<input type="submit" value="Submit" /> 

Ich bin nicht die Werte immer ich die Anzeige für alle ausgewählten Radiobuttons, es gibt immer einen Wert in Formularsammlung zurück

[HttpPost] 
public ActionResult Quiz(Quiz userResponse, FormCollection form) 
{ 
    foreach (var item in form.AllKeys) 
    { 
     string value = form[item]; 
     // save data 
    } 
    //var selectedOption = frm["Id"]; 
    return View(); 
} 

Können Sie bitte h Elfe?

+1

Sie können keine "foreach" -Schleife für die "Fragen" verwenden - Sie benötigen eine 'for' -Schleife oder eine benutzerdefinierte' EditorTemplate'. In [Antwort] (http://stackoverflow.com/questions/28055287/asp-net-mvc-5-group-of-radio-buttons/28057533#28057533) finden Sie ein Beispiel zum Generieren der Ansicht. Und verwenden Sie 'FormCollection' nicht –

+0

@StephenMuecke Sie sollten dies eine Antwort geben. OP es ist wahrscheinlich nur 1 Wert in der Sammlung zurückgeben, weil die HTML-Markup für die Radio-Tasten gegenseitig überschreiben (alle gleichen Namen und ID), deshalb müssen Sie für jede Schleife zu unterscheiden. –

+1

@MartinMazzaDawson, Zeitverschwendung, um einigen Benutzern zu helfen :) –

Antwort

1

Sie erstellen Optionsfelder, die keine Beziehung zu Ihrem Modell haben und alle das gleiche name="Id" Attribut haben (und Sie könnten nur eine Option aus allen Fragen auswählen). Sie müssen eine for Schleife oder 10 für typeof Question verwenden (siehe this answer für eine detailliertere Erklärung). Mit einem EditorTemplate, wird Ihr Code

/Views/Shared/EditorTemplates/Question.cshtml

@model Question 
@Html.HiddenFor(m => m.Id) 
@Html.DisplayFor(m => m.QuestionText) 
@foreach(var option in Model.Options) 
{ 
    <div> 
     <label> 
      @Html.RadioButtonFor(m => m.AnswerId , option,Id, new { id = "" }) 
      <span>@option.OptionText</span> 
     </label> 
    </div> 
} 

und in der Hauptansicht

@model Quiz 
@using (Html.BeginForm()) 
{ 
    @Html.EditorFor(m => m.Questions) 
    <input type="submit" value="Save" /> 
} 

und der Controller-Methode sein

[HttpPost] 
public ActionResult Quiz(Quiz model) 

Das Modell in der POST-Methode wird mit jeder Frage gebunden sein, die seine Id a enthält nd AnswerId (die Id der ausgewählten Option) Eigenschaften.

Seitennotiz: Ihre aktuelle POST-Methode hat return View(), aber dies würde fehlschlagen, da der Wert jeder Options-Eigenschaft null ist. Wenn Sie die Ansicht zurückgeben müssen (was nur erforderlich sein sollte, wenn ModelState ungültig ist), müssen Sie diese Sammlungen erneut füllen.

Verwandte Themen