我刚刚进入 MVC (v4) 的世界,但在获取单选按钮列表的实际选定值时遇到了真正的困难。我正在从 Umbraco 数据库中提取数据(但我想我想做的事情的原理是相同的),其中有问题列表,每个问题都有一个答案列表。我将发布迄今为止我所做的所有事情,希望比我更聪明的人能够指出我正确的方向:
这是我的内容结构
我的模型
namespace ICASolution.Models
{
public class MultipleChoiceViewModel
{
public int iQuestionID { get; set; }
public string zQuestionTitle { get; set; }
public string zQuestionText { get; set; }
public List<Answers> lAnswers { get; set; }
}
public class Answers
{
public int iAnswerID { get; set; }
public string zAnswerText { get; set; }
public bool bCorrect { get; set; }
public string selectedAnswer { get; set; }
}
}
我的表面 Controller :
namespace ICASolution.Controllers
{
public class MultipleChoiceSurfaceController : SurfaceController
{
//
// GET: /MultipleChoiceSurface/
//public ActionResult Index()
//{
// return PartialView("MultipleChoice", new MultipleChoiceViewModel());
//}
[HttpPost]
public ActionResult Grade(MultipleChoiceViewModel model)
{
return RedirectToCurrentUmbracoPage();
}
public ActionResult Index()
{
var TestPage = Umbraco.Content(CurrentPage.Id);
var questions = new List<MultipleChoiceViewModel>();
foreach (var child in TestPage.Children)
{
var questionid = child.Id;
var questiontitle = child.GetPropertyValue("questionTitle");
var questiontext = child.GetPropertyValue("questionText");
questions.Add(new MultipleChoiceViewModel { iQuestionID = questionid, zQuestionTitle = questiontitle, zQuestionText = questiontext, lAnswers = answerList(questionid) });
}
return PartialView("MultipleChoice", questions);
}
public List<Answers> answerList(int iMyQuestionID)
{
var questionPage = Umbraco.Content(iMyQuestionID);
var answers = new List<Answers>();
foreach(var child in questionPage.Children)
{
answers.Add(new Answers { iAnswerID = child.Id, zAnswerText = child.GetPropertyValue("answerTitle"), bCorrect = child.GetPropertyValue("correctAnswer") });
}
return answers;
}
}
}
最后是我的部分:
@model IEnumerable<ICASolution.Models.MultipleChoiceViewModel>
<div class="ethicsTestContainer">
<div class="col-md-12">
<div class="col-md-12 noRPadding">
@using (Html.BeginUmbracoForm<ICASolution.Controllers.MultipleChoiceSurfaceController>("Grade")) {
foreach (var item in Model)
{
<div class="form-group">
<p><strong>@item.zQuestionTitle</strong></p>
<p>@item.zQuestionText</p>
@{
foreach (var answerItem in item.lAnswers)
{
<div class="radio radio-danger">
@Html.RadioButton(answerItem.iAnswerID.ToString(), answerItem.iAnswerID, new { @type = "radio", @id = answerItem.iAnswerID, @name = item.iQuestionID })
@*<input type="radio" name="@item.iQuestionID" id="@answerItem.iAnswerID" value="option1">*@
<label for="@answerItem.iAnswerID">
@answerItem.zAnswerText <span> </span>@answerItem.bCorrect
</label>
</div>
}
}
</div>
}
<div class="col-sm-8 col-sm-push-2">
<button type="submit" class="btn btn-default btn-block">CLICK HERE TO COMPLETE YOUR ETHICS TEST</button>
</div>
}
</div>
</div>
</div>
向用户显示时一切都呈现良好:
但我就是不知道如何获取用户在 HTTPPOST 上所做的选择(基本上我需要计算他们所做的正确答案的数量)。
最佳答案
您的问题是您正在生成 MultipleChoiceViewModel
的控件在 foreach
循环生成重复 name
无法绑定(bind)到集合(它们不包括索引器)且重复的属性 id
无效的 html 属性。您需要在 for
中生成控件循环(或使用自定义 EditorTemplate
作为 MultipleChoiceViewModel
类型)
您还需要移动 selectedAnswer
属性至MultipleChoiceViewModel
(不在 selectedAnswer
中)
使用 for
循环(型号必须是 IList<MultipleChoiceViewModel>
)
for(int i = 0; i < Model.Count; i++)
{
@Html.HiddenFor(m => m[i].iQuestionID) // for post back
@Html.DisplayFor(m => m[i].zQuestionTitle)
...
foreach(var item in Model[i].lAnswers)
{
@Html.RadioButtonFor(m => m[i].selectedAnswer, item.iAnswerID, new { id = item.iAnswerID })
<label for="@item.iAnswerID">@item.zAnswerText</label>
}
}
使用EditorTempate
,在 /Views/Shared/EditorTemplates
中创建局部 View 命名MultipleChoiceViewModel.cshtml
@model yourAssembly.MultipleChoiceViewModel
@Html.HiddenFor(m => m.iQuestionID)
@Html.DisplayFor(m => m.zQuestionTitle)
...
foreach(var item in Model.lAnswers)
{
@Html.RadioButtonFor(m => m.selectedAnswer, item.iAnswerID, new { id = item.iAnswerID })
<label for="@item.iAnswerID">@item.zAnswerText</label>
}
然后在主视图中,替换 for
循环
@Html.EditorFor(m => m)
EditorFor()
方法将根据集合中每个项目的模板生成 html。
旁注:RadioButtonFor()
生成type="radio"
所以添加一个html @type = "radio"
毫无意义。并且永远不要覆盖 name
使用 html 助手时的属性
关于c# - MVC 4 获取选定单选按钮的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31164937/