【问题标题】:MVC 4 getting values of selected radio buttonsMVC 4获取选定单选按钮的值
【发布时间】:2015-07-01 14:59:26
【问题描述】:

我只是冒险进入 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; }
    }
}

我的表面控制器:

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>

向用户显示时一切都很好:

但我只是不知道如何获取用户在 HTTPPOST 上所做的选择(基本上我需要计算他们做出的正确答案的数量)。

【问题讨论】:

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


    【解决方案1】:

    您可以使用以下代码创建单选按钮:

    <div class="mt-radio-inline">
      <label class="mt-radio">
        <input type="radio" name="q1" value="q1_Chart"> Chart
        <span></span>
      </label>
      <label class="mt-radio">
        <input type="radio" name="q1" value="q1_AnySize"> Any Size 
        <span></span>                                                
      </label>
    </div>
    

    并从下面给出的代码中获取选定的单选按钮值:

    string q = form["q1"];
    

    在上面的代码中表单是FormCollection

    的对象

    这将为您提供一组选定单选按钮的字符串。

    【讨论】:

      【解决方案2】:

      您的问题是您在foreach 循环中生成MultipleChoiceViewModel 的控件,并生成无法绑定到集合的重复name 属性(它们不包括索引器)和重复的id 属性是无效的 html。您需要在for 循环中生成控件(或使用自定义EditorTemplate 来表示MultipleChoiceViewModel 的类型)

      您还需要将selectedAnswer 属性移动到MultipleChoiceViewModel(不在selectedAnswer 中)

      使用for 循环(模型必须为IList&lt;MultipleChoiceViewModel&gt;

      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 中创建一个名为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",因此为 @type = "radio" 添加 html 是没有意义的。并且在使用 html 帮助器时永远不要覆盖 name 属性

      【讨论】:

      • 哪一部分不明白?
      • 嗨斯蒂芬,首先感谢您的宝贵时间其次您迷失了我(!),老实说,我在某些控件上玩得很好(如您所知),我最终让自己感到困惑。我已将 SelectedAnswer 属性移到 MultipleChoiceViewModel 中。但是按照您的代码,我在 @Html.HiddenFor(m => m[i].iQuestionID)) 上遇到错误,无法将 [] 索引应用于类型为 'System.Collections.Generic.IEumerable' 来自 WebForms 的整个 MVC 感觉就像黑魔法,因此非常感谢任何帮助。
      • 不,您的模型必须是 IList&lt;MultipleChoiceViewModel&gt;(参见第 3 段)。如果由于某种原因您无法将其更改为 List&lt;T&gt;,那么您需要为 MultipleChoiceViewModel 类型使用自定义 EditorTemplate
      • 哦,抱歉,错过了那部分!恐怕还是同样的错误,我什至不知道 EditorTemplate 是什么(!)我想我可能在这里太快地冒险进入兔子洞了
      • 其实持有这个想法(我可能比平时更白痴!)
      猜你喜欢
      • 2014-08-24
      • 2016-07-17
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 2017-02-15
      • 2012-01-27
      相关资源
      最近更新 更多