动态MVC单选按钮组中选择答案(Dynamic MVC RadioButton Group Sele

2019-11-03 08:06发布

我的问题和答案动态填充的列表。

两个问题:

  1. 这些问题和答案回发后不显示
  2. 所选择的答案是失踪

视图模型

public class RegistrationViewModel : RegisterExternalLoginModel
{
    //...etc...
    public Question Question { get; set; }
    public Answer Answer { get; set; }
    public List<Question> Questions { get; set; }
    public IList<Answer> PossibleAnswers { get; set; }
    public List<SelectedAnswer> SelectedAnswers { get; set; }
    public IList<SelectedAnswer> PreviousAnswers 
    { 
        set 
        { 
            foreach(Question q in Questions)
            {
                q.SelectedAnswers = value.Where(t => t.questionId == q.objectId).ToList() ;
            }
        } 
    }
}

选择的答案

 public Answer SelectedAnswer 
    { 
        get 
        {
            if (SelectedAnswers != null && SelectedAnswers.Count > 0)
            {
                var answers = SelectedAnswers.Where(t => t.questionId == objectId);
                if (answers.Count() == 1) 
                {
                    var result = Answers.Where(t => t.objectId == answers.First().answerId).First();
                    return result;
                }
            }
            return null;
        } 
    }

的ActionResult

 public ActionResult CreateQuestions()
    {
        RegistrationViewModel vm = new RegistrationViewModel();
        IQFacade facade = new QFacade(CreateUserContext(true));

        //Questions and Answers
        vm.Questions = facade.GetQuestions().ToList();
        vm.PossibleAnswers = facade.GetPossibleAnswers();

        return View(vm);

    }

岗位

 [HttpPost]
 public ActionResult CreateQuestions(RegistrationViewModel vm)
    {
        var context = CreateUserContext(true);

            try{
                IQFacade f = new QFacade(context);
                f.CreateSomething(vm.User.name, vm.etc, vm.SelectedAnswers);//Need all the answers here, but null
            }
            catch (Exception ex)
            {
                //error stuff, etc...
                return View(vm);//the questions do not appear after this point. Do I need to bind them again from GetQuestions or shouldn't they still be a part of the vm object that I am returning?
            }
        }

        return RedirectToAction("Index");
    }

在意见中,我使用的编辑器模板

 @Html.EditorFor(x => x.Questions)

模板

  @foreach (var possibleAnswer in Model.Answers)
{
    <div class="radio">
        @Html.RadioButtonFor(question => question.SelectedAnswer, possibleAnswer.objectId, new { id = possibleAnswer.objectId })

        <label for="@possibleAnswer.objectId">@possibleAnswer.text <span>@possibleAnswer.value</span></label> <p>@possibleAnswer.description</p>
    </div>
}

一切工作的第一次,但不是回发后。 我已经经历了几十个类似的SO职位的阅读。 我在想什么?

Answer 1:

根据意见,你的模型应该是这样的(不知道你的所有模特属性的,所以我在这里做一些假设)

public class QuestionVM
{
  public int ID { get; set; } // for binding
  public string Text { get; set; }
  [Required]
  public int? SelectedAnswer { get; set; } // for binding
  public IEnumerable<Answer> PossibleAnswers { get; set; }
}

public class RegistrationViewModel : RegisterExternalLoginModel
{
  public RegistrationViewModel()
  {
    Questions = new List<QuestionVM>();
  }
  //...etc...
  public List<QuestionVM> Questions { get; set; }
}

GET方法

public ActionResult CreateQuestions()
{
    RegistrationViewModel vm = new RegistrationViewModel();
    .....
    // Populate the questions and answers
    var questions = facade.GetQuestions().ToList();
    var answers = facade.GetPossibleAnswers();
    foreach (var question in questions)
    {
      QuestionVM qvm = new QuestionVM();
      qvm.ID = question.ID;
      qvm.Test = question.Text;
      // Add possible answers for the question
      qvm.PossibleAnswers = answers.Where(a => a.QuestionID ==  question.ID);
      // If loading existing questions/answers for existing user, also set value of current SelectedAnswer so its selected by default in the view
      vm.Questions.Add(qvm);
    }
    return View(vm);
}

视图

@model YourAssembly.RegistrationViewModel
....

@for(int i = 0; i < Model.Questions.Count; i++)
{
  @Html.HiddenFor(m > m.Questions[i].ID) // for binding
  @Html.DisplayFor(m > m.Questions[i].Text)
  foreach(var answer in Model.Questions[i].PossibleAnswers)
  {
    @Html.RadioButtonFor(m => m.Questions[i].SelectedAnswer, answer.ID, new { id = answer.ID})
    <label for="@answer.ID">answer.Text</label>
  }
}

POST方法

[HttpPost]
public ActionResult CreateQuestions(RegistrationViewModel vm)
{
  if (!ModelState.IsValid)
  {
    // You need to rebuild the question text and possible answers because these are not posted back
    return View(vm);
  }
  // Your model is now populated with the ID of each question and the selected answer which can be saved to the database

注意,你可以为这个问题添加隐藏的输入,并回答文本值,使他们回来后,但一般其更好的性能在控制器中重装(如果包括正确的数据说明,包括客户端验证,模型应该总是在回发有效无论如何)



文章来源: Dynamic MVC RadioButton Group Selected Answers