c# - MVC 4 获取选定单选按钮的值

标签 c# asp.net asp.net-mvc asp.net-mvc-4 umbraco7

我刚刚进入 MVC (v4) 的世界,但在获取单选按钮列表的实际选定值时遇到了真正的困难。我正在从 Umbraco 数据库中提取数据(但我想我想做的事情的原理是相同的),其中有问题列表,每个问题都有一个答案列表。我将发布迄今为止我所做的所有事情,希望比我更聪明的人能够指出我正确的方向:

这是我的内容结构

enter image description here

我的模型

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>&nbsp;</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>

向用户显示时一切都呈现良好:

enter image description here

但我就是不知道如何获取用户在 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/

相关文章:

c# - 即使关注另一个控件,如何更改 ListView 选定行的背景色?

c# - 子集求和算法效率

c# - C# 4.0 中的 Barrier 和 C# 3.0 中的 WaitHandle 之间的区别?

c# - 从 ASP.NET 5 Beta 4 升级到 Beta 5 时出错

c# - 使用 DropdownListFor - 使用 Jquery 设置值,也显示在控制台中,但在 Controller 处为 Null

asp.net - 构建 nhibernate 的标准

javascript - 在文本框中插入随机文本 cshtml javascript MVC3

asp.net-mvc - Sitecore MVC渲染类型说明

asp.net-mvc - ASP.NET MVC4 - 具有 actionLinks 的 2 个 Controller 的不同路由

asp.net - Html.EnumDropDownListFor 不显示所选属性值