代码之家  ›  专栏  ›  技术社区  ›  AminM LordDoskias

获取多组单选按钮asp.net mvc 5的选定值

  •  0
  • AminM LordDoskias  · 技术社区  · 7 年前


    我使用下面的代码让每个用户从单选按钮中选择一个选项

    foreach (var question in Model.Questions)
         {
           @Html.Hidden("QuestionId", question.QuestionId.ToString())
             <div class="row m-0  bg-silver-light border">
                 <div class="col-12 bg-light pt-2 pb-2">
                     <h6>
                         @question.QuestionTitle
                     </h6>
                     <p class="text-secondary small m-0">
                         @question.QuestionBody
                     </p>
                 </div>
    
    
                 <div class="col-12 pt-2 pb-2">
                     <div class="form-check-inline">
                         <label class="form-check-label" for="radio2">
                             <input name="@("q"+question.SeminarQuestionId)" type="radio" class="form-check-input" id="radio2" value="20">20
                         </label>
                     </div>
                     <div class="form-check-inline">
                         <label class="form-check-label" for="radio3">
                             <input name="@("q"+question.SeminarQuestionId)" type="radio" class="form-check-input" id="radio3" value="40">40
                         </label>
                     </div>
                     <div class="form-check-inline">
                         <label class="form-check-label" for="radio4">
                             <input name="@("q"+question.SeminarQuestionId)" type="radio" class="form-check-input" id="radio4" value="60">60
                         </label>
                     </div>
                     <div class="form-check-inline">
                         <label class="form-check-label" for="radio5">
                             <input name="@("q"+question.SeminarQuestionId)" type="radio" class="form-check-input" id="radio5" value="80">80
                         </label>
                     </div>
                     <div class="form-check-inline">
                         <label class="form-check-label" for="radio6">
                             <input name="@("q"+question.SeminarQuestionId)" type="radio" class="form-check-input" id="radio6" value="100">100
                         </label>
                     </div>
                 </div>
             </div>
         }  
    

    以下是我的行动方法:

    foreach (string key in Request.Form.Keys)
                {
    
                    if (key == "QuestionId") 
                    {
                        int qId = Convert.ToInt32(Request.Form[key]);
                        var q = _dbContext.Questions.FirstOrDefault(x => x.QuestionId == qId);
                        var reviews = _dbContext.QuestionReviews.Where(x => x.QuestionId == qId).ToList();
                        foreach (var review in reviews)
                        {
                            var k = "q" + review.QuestionId;  /// get q1,q2 and ... 
                            review.ReviewPoint =Convert.ToInt32(Request.Form[k]);
                        }
    
                    }
                }
    

    在用户点击提交按钮后,我应该在控制器中得到问题ID和答案值的列表 我的问题是用户应该同时回答几个问题,我不知道如何在控制器中获取问题ID和每个问题的选定无线电值

    1 回复  |  直到 7 年前
        1
  •  1
  •   acurtis166    7 年前

    如果你把你的 foreach for 循环时,可以使用相同的索引关联值 i 对于您的输入名称:

    @for (int i = 0; i < Model.Questions.Count(); i++)
    {
        @Html.HiddenFor(model => model.Questions[i].QuestionId)
        <div class="row m-0  bg-silver-light border">
            <div class="col-12 bg-light pt-2 pb-2">
                <h6>
                    @Model.Questions[i].QuestionTitle
                </h6>
                <p class="text-secondary small m-0">
                    @Model.Questions[i].QuestionBody
                </p>
            </div>
    
    
            <div class="col-12 pt-2 pb-2">
                <div class="form-check-inline">
                    <label class="form-check-label" for="radio2">
                        @Html.RadioButtonFor(model => model.Questions[i].Answer, 20, htmlAttributes: new { @class = "form-check-input", @id = "radio2"})
                        20
                    </label>
                </div>
                <div class="form-check-inline">
                    <label class="form-check-label" for="radio3">
                        @Html.RadioButtonFor(model => model.Questions[i].Answer, 40, htmlAttributes: new { @class = "form-check-input", @id = "radio3" })
                        40
                    </label>
                </div>
                <div class="form-check-inline">
                    <label class="form-check-label" for="radio4">
                        @Html.RadioButtonFor(model => model.Questions[i].Answer, 60, htmlAttributes: new { @class = "form-check-input", @id = "radio4" })
                        60
                    </label>
                </div>
                <div class="form-check-inline">
                    <label class="form-check-label" for="radio5">
                        @Html.RadioButtonFor(model => model.Questions[i].Answer, 80, htmlAttributes: new { @class = "form-check-input", @id = "radio5" })
                        80
                    </label>
                </div>
                <div class="form-check-inline">
                    <label class="form-check-label" for="radio6">
                        @Html.RadioButtonFor(model => model.Questions[i].Answer, 100, htmlAttributes: new { @class = "form-check-input", @id = "radio6" })
                        100
                    </label>
                </div>
            </div>
        </div>
    } 
    

    Questions ,例如:

    public class QuestionReviewViewModel
    {
        public List<QuestionModel> Questions { get; set; } = new List<QuestionModel>();
    }
    

    您可以将QuestionId和答案值绑定到QuestionModel:

    public class QuestionModel
    {
        public int QuestionId { get; set; }
        public int Answer { get; set; }
    }
    

    通过简单地绑定到 HttpPost 行动:

    [HttpPost]
        public ActionResult PostAction(QuestionReviewViewModel vm)
        {
            if (ModelState.IsValid)
            {
                for (int i = 0; i < vm.Questions.Count; i++)
                {
                    int id = vm.Questions[i].QuestionId;
                    int answer = vm.Questions[i].Answer;
                }
    
                return Content("Something good");
            }
            else
            {
                return Content("Something rotten");
            }
        }
    

    Post back example

    在这种情况下,我会使用SelectList-> https://docs.microsoft.com/en-us/dotnet/api/system.web.mvc.selectlist?view=aspnet-mvc-5.2

    您可以将SelectList属性添加到QuestionModel中(有关参数,请参阅上面的文档),这允许您设置所选值( Answer 在这种情况下):

    // List of possible answers to this question
        // populated from data source
        public List<int> AnswerList = new List<int> { 20, 40, 60, 80, 100 };
    
        // An MVC SelectList Class
        public SelectList PossibleAnswers => new SelectList(AnswerList, Answer);
    

    然后,在视图中,您可以循环浏览可能的答案,如果选择了项目,则有条件地应用checked属性:

    <div class="col-12 pt-2 pb-2">
                @foreach (var item in Model.Questions[i].PossibleAnswers)
                    {
                        var htmlAttr = new Dictionary<string, object>{{ "@class", "form-check-input" }};
    
                    if (item.Selected)
                    {
                        htmlAttr.Add("@checked", true);
                    }
    
                    <div class="form-check-inline">
                        <label class="form-check-label" for="radio2">
                            @Html.RadioButtonFor(model => model.Questions[i].Answer, item.Text, htmlAttributes: htmlAttr)
                            @item.Text
                        </label>
                    </div>
                }
            </div>