2016-06-21 12 views
0

Ich habe eine Quiz-Anwendung, die Fragen mit mehreren Antworten hat. Das Problem ist, dass ich keine Idee habe, wie man die beantworteten Optionen an den Controller sendet, um zu überprüfen, ob sie korrekt sind. Bisher habe ich ein Formular mit mehreren Kontrollkästchen erstellt, aber ich bin verwirrt, welchen Typ sollte die Controller-Methode erhalten? HierÜberprüfen von Fragen mehrere richtige Antworten in MVC.NET

ist die Form:

@using (Html.BeginForm("CheckAnswers", "Questions", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 

     @foreach (var item in Model.OfferedAnswers) 
     { 

      <hr /> 
      <div class="form-group"> 
       @Html.HiddenFor(modelItem => item.ID) 
       @Html.HiddenFor(modelItem=>item.QuestionID) 
       @Html.HiddenFor(modelItem=>item.AnswerID) 
       @Html.LabelFor(modelItem => item.Answer.text, "AnswerID", htmlAttributes: new { @class = "control-label col-md-2" }) 
       <div class="col-md-10"> 
        @Html.CheckBox("IsCorrect", false, htmlAttributes: new { @class = "form-control" }) 
        @Html.ValidationMessageFor(modelItem => item.Answer.text, "", new { @class = "text-danger" }) 
       </div> 
      </div> 
     } 


     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Провери" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

Hier ist der Code der Controller-Methode:

public ActionResult CheckAnswers(int ID, int QuestionID, int AnswerID, bool isCorrect) 
    { 

     OfferedAswer oa = db.OfferedAnswers.Find(ID); 

     return RedirectToAction("Index"); 
    } 

Dies kann für einzelne Choice-Antworten arbeiten. Ich bin neu bei .net mvc. Danke im Voraus.

+0

Sie können eine 'foreach'-Schleife nicht verwenden, um Formularsteuerelemente für Sammlungen zu generieren. Verweisen [diese Antwort] (http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943#30094943) –

Antwort

1

Nun, zuerst müssen Sie etwas als Parameter für Ihre Aktionsmethode akzeptieren, an die die geposteten Werte gebunden werden können. Zum Beispiel:

public ActionResult CheckAnswers(List<QuestionAnswerViewModel> model) 

Wo QuestionAnswerViewModel hätte die 4 params Sie derzeit dort als Eigenschaften haben.

Hier wäre es jedoch am besten, nur das gleiche Modell zu akzeptieren, das Sie aus Ihrer Sicht verwenden. Auf diese Weise werden die geposteten Werte wieder an die Herkunft gebunden.

Dann Ihrer Ansicht nach müssen Sie for verwenden, anstatt foreach, so dass Sie am Ende mit indizierten Feldnamen nach oben:

@for (var i = 0; i < Model.OfferedAnswers.Count(); i++) 
    { 

     <hr /> 
     <div class="form-group"> 
      @Html.HiddenFor(m => m.OfferedAnswers[i].ID) 
      @Html.HiddenFor(m => m.OfferedAnswers[i].QuestionID) 
      @Html.HiddenFor(m => m.OfferedAnswers[i].AnswerID) 
      @Html.LabelFor(m => m.OfferedAnswers[i].Answer.text, "AnswerID", htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.CheckBoxFor(m => m.OfferedAnswers[i], false, htmlAttributes: new { @class = "form-control" }) 
       @Html.ValidationMessageFor(m => m.OfferedAnswers[i].Answer.text, "", new { @class = "text-danger" }) 
      </div> 
     </div> 
    } 
0

Sie Editor Vorlagen verwenden können.

Angenommen, Ihre Ansicht Modell für Ihre GET Ansicht wie folgt aussieht

public class QuestionViewModel 
{ 
    public int Id {set;get;} 
    public string QuestionText { set;get;} 
    public List<Answer> OffererdAnswers {set;get;} 
} 
public class Answer 
{ 
    public int Id {set;get;} 
    public string AnswerText {set;get;} 
    public bool IsSelected { set;get;} 
} 

nun in Ihrer GET Aktion, laden Sie die OffererdAnswers Sammlung eines QuestionViewModel Objekt und dass

public ActionResult Question() 
{ 
    var vm = new QuestionViewModel { Id=2, QuestionText="What is your dream"}; 
    vm.OfferedAnswers = new List<Answer>{ 
     new Answer { Id=1, AnswerText="Get a job" }, 
     new Answer { Id=2, AnswerText="Buy a car" }, 
     new Answer { Id=3, AnswerText="Buy a boat" }, 
    }; 
    return View(vm); 
} 
der Ansicht Senden

Erstellen Sie jetzt eine Editor-Vorlage in ~/Views/YourCurrentControllerDirectory/EditorTemplates. Der Dateiname sollte Answer.cshtml (derselbe Name wie der Typ, für den wir verwenden werden) sein. Fügen Sie diesen Code in diese Datei

@model YourNamespaceHere.Answer 
<div> 
    @Html.CheckBoxFor(s => s.IsSelected) 
    @Html.HiddenFor(s=>s.Id) 
    @Html.LabelFor(s=>s.AnswerText) 
</div> 

Jetzt in der Hauptansicht, die stark an die QuestionViewModel eingegeben wird, verwenden Sie einfach die EditorFor Hilfsmethode. für Ihre Httppost Aktionsmethode

@model YourNamespaceHere.QuestionViewModel 
<h2>@Model.QuestionText</h2> 
@using(Html.BeginForm()) 
{ 
    @Html.HiddenFor(s=>s.Id) 
    @Html.EditorFor(s=>s.OfferedAnswers) 
    <input type="submit"/> 
} 

Sie können den gleichen Typ (QuestionViewModel) als Parametertyp halten. Wenn das Formular gebucht wird, überprüfen Sie die OfferedAnswers Sammlung und filtern Sie die One mit IsSelected auf True festgelegt.

[HttpPost] 
public ActionResult Question(QuestionViewModel model) 
{ 
    var answers = model.OfferedAnswers.Where(s=>s.IsSelected); 
    // to do return something. 
} 
Verwandte Themen