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)
假设您的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模型绑定:)

您可以在这里阅读并下载工作示例.
| 归档时间: |
|
| 查看次数: |
3202 次 |
| 最近记录: |