3

我正在开发一个用于评分问题的页面。

在视图中,我有一个问题列表和每个问题前面的 5 个单选按钮。

<input name="evalId" type="hidden" value="@Model.Evaluation.EvalId" />
foreach (var question in questionList)
{
     <input name="questionId" type="hidden" value="@question.QuestionId" />
     <div class="row_star" style="border-bottom : 0 none; background: none;">
       @if (!String.IsNullOrEmpty(question.QuestionTitre))
       {
         <p>@question.QuestionTitre.TrimEnd()</p>
       }

       @* here goes the code for 5 radio buttons*@
}

现在,在我的控制器中,我希望能够知道为每个问题检查了哪个单选按钮。

我怎样才能做到这一点 ?

这是我的视图模型

public class EvaluationViewModel
{
    /// <summary>
    /// 
    /// </summary>
    public EvalEvaluation Evaluation
    {
        get;
        set;
    }

    /// <summary>
    /// 
    /// </summary>
    public Dictionary<EvalQuizz, List<EvalQuestion>> EvalQuizzQuestionList
    {
        get;
        set;
    }
}
4

1 回答 1

6

假设您的 ViewModel 是这样的

public class Question
{
    public int ID { set; get; }
    public string QuestionText { set; get; }
    public List<Answer> Answers { set; get; }
    public int SelectedAnswer { set; get; }
    public Question()
    {
        Answers = new List<Answer>();
    }
}
public class Answer
{
    public int ID { set; get; }
    public string AnswerText { set; get; }
}
public class Evaluation
{
    public List<Question> Questions { set; get; }
    public Evaluation()
    {
        Questions = new List<Question>();
    }
}

在您的 GET 操作方法中,您会将视图模型返回到视图,其中填充了一些问题和答案。在下面的代码中,我对问题和答案进行了硬编码。你可以从你的 Repository/Service 层得到它。

public ActionResult Index()
{
    var evalVM = new Evaluation();

    //the below is hardcoded for DEMO. you may get the data from some  
    //other place and set the questions and answers

    var q1=new Question { ID=1, QuestionText="What is your favourite language"};
    q1.Answers.Add(new Answer{ ID=12, AnswerText="PHP"});
    q1.Answers.Add(new Answer{ ID=13, AnswerText="ASP.NET"});
    q1.Answers.Add(new Answer { ID = 14, AnswerText = "Java" });
    evalVM.Questions.Add(q1);

    var q2=new Question { ID=2, QuestionText="What is your favourite DB"};
    q2.Answers.Add(new Answer{ ID=16, AnswerText="SQL Server"});
    q2.Answers.Add(new Answer{ ID=17, AnswerText="MySQL"});
    q2.Answers.Add(new Answer { ID=18, AnswerText = "Oracle" });
    evalVM.Questions.Add(q2);

    return View(evalVM);
}

现在我们将创建一个编辑器模板来呈现我们的问题。因此,转到您的视图文件夹并在您当前控制器名称的文件夹下创建一个名为EditorTemplates的文件夹。在 EditorTemplates 文件夹中添加一个视图,并赋予与我们要表示的类名相同的名称。IE :Question.cshtml 在此处输入图像描述

现在把这段代码放在编辑器模板中

@model YourNameSpace.Question
<div>
    @Html.HiddenFor(x=>x.ID)
    @Model.QuestionText
    @foreach (var a in Model.Answers)
    {
        <p>
        @Html.RadioButtonFor(b=>b.SelectedAnswer,a.ID)  @a.AnswerText 
        </p>
    }
</div>

现在转到我们的主视图并使用 EditorTemplate html 辅助方法将我们创建的 EditorTemplate 带到主视图。

@model YourNameSpace.Evaluation
<h2>Index</h2>
@using (Html.BeginForm())
{
    @Html.EditorFor(x=>x.Questions)
    <input type="submit" />
}

现在在您的 HttpPost 中,您可以检查发布的模型并在那里获取选定的单选按钮 (SelectedAnswer) 值

[HttpPost]
public ActionResult Index(Evaluation model)
{
    if (ModelState.IsValid)
    {
        foreach (var q in model.Questions)
        {
            var qId = q.ID;
            var selectedAnswer = q.SelectedAnswer;
            //Save

        }
        return RedirectToAction("ThankYou"); //PRG Pattern
    }
    //reload questions
    return View(model);
}

如果您使用 Visual Studio 断点,您可以看到发布的值。感谢 MVC 模型绑定 :) 在此处输入图像描述

您可以在此处阅读并下载工作示例。

于 2012-10-11T17:47:44.217 回答