在MVC.NET中检查多个正确答案的问题

时间:2016-06-21 17:16:09

标签: c# asp.net-mvc

我有一个测验应用程序,它有多个答案的问题。问题是我不知道如何将已应答的选项发送到控制器以检查它们是否正确?到目前为止,我已经制作了一个带有多个复选框的表单,但我很困惑控制器方法应该接收哪种类型?

以下是表格:

 @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>
}

以下是控制器方法的代码:

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

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

        return RedirectToAction("Index");
    }

这可能适用于单选答案。我是.net mvc的新手。提前谢谢。

2 个答案:

答案 0 :(得分:1)

嗯,首先,您需要接受某些内容作为您的操作方法的参数,以便发布的值可以绑定到该方法。例如:

public ActionResult CheckAnswers(List<QuestionAnswerViewModel> model)

QuestionAnswerViewModel哪里有4个参数,你现在已经将它作为属性。

但是,在这里,最好只接受您在视图中使用的相同模型。这样,发布的值将自然地绑定到它们来自的位置。

然后,在您看来,您需要使用for而不是foreach,因此您最终会使用索引字段名称:

    @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>
    }

答案 1 :(得分:0)

您可以使用编辑模板

假设您的GET视图的视图模型如下所示

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

现在,在您的GET操作中,您正在加载OffererdAnswers对象的QuestionViewModel集合并将其发送到视图

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);
}

现在在~/Views/YourCurrentControllerDirectory/EditorTemplates中创建一个编辑器模板。文件名应为Answer.cshtml(与我们将要使用的类型相同)。将此代码粘贴到该文件

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

现在在您的主视图中,它是一个强类型的QuestionViewModel,只需使用EditorFor帮助方法。

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

您可以将相同的类型(QuestionViewModel)保留为HttpPost操作方法的参数类型。发布表单后,请检查OfferedAnswers集合,并在IsSelected设置为true的情况下过滤该表单。

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