[英]Dynamic MVC RadioButton Group Selected Answers
我有一个动态填充的问题和答案列表。
两个问题:
视图模型
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帖子。 我想念什么?
根据评论,您的模型应该类似(不确定所有模型属性,因此我在这里做一些假设)
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
请注意,您可以为问题和答案文本值添加隐藏的输入,以便它们回发,但是通常,它可以更好地重新加载到控制器中(如果您包括正确的数据注释并包括客户端验证,则该模型应始终在回发时有效)无论如何)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.