获取ASP MVC 3中的单选按钮值列表

kba*_*che 3 radio-button razor asp.net-mvc-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*@
}
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能做到这一点 ?

这是我的ViewModel

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

    /// <summary>
    /// 
    /// </summary>
    public Dictionary<EvalQuizz, List<EvalQuestion>> EvalQuizzQuestionList
    {
        get;
        set;
    }
}
Run Code Online (Sandbox Code Playgroud)

Shy*_*yju 5

假设您的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>();
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的GET操作方法中,您将视图模型返回到视图,其中填写了一些问题和答案.在下面的代码中,我已经对问题和答案进行了硬编码.您可以从Repositary/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);
}
Run Code Online (Sandbox Code Playgroud)

现在我们将创建一个编辑器模板来呈现我们的问题.所以转到你的View文件夹,在你当前控制器名称的文件夹下创建一个名为EditorTemplates的文件夹.将视图添加到EditorTemplates文件夹,并提供与我们要表示的类名相同的名称.即:Question.cshtml 在此输入图像描述

现在把这段代码放在编辑器的tempalte中

@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>
Run Code Online (Sandbox Code Playgroud)

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

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

现在在您的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);
}
Run Code Online (Sandbox Code Playgroud)

如果使用visual studio断点,则可以看到发布的值.感谢MVC模型绑定:) 在此输入图像描述

您可以在这里阅读并下载工作示例.