【发布时间】:2014-06-30 19:09:33
【问题描述】:
我怎样才能不仅维护广播组的问题和答案,而且在返回错误的帖子之后维护已检查的广播?
“联系”页面返回多项选择题列表。如果出现错误,则视图不包含答案或所选值。
我已经四处搜索,但没有找到一个可以将所有内容组合在一起的答案。这个很接近:How do I transfer ViewModel data between POST requests in ASP.NET MVC?
但我不敢相信四年后没有更简单的解决方案。
肯说:
您可以从中获取当前选定的项目(即验证失败) 包含已发布并绑定到的 id 的属性 你的类的实例。
...这就是我本质上想要做的:坚持检查过的收音机。但我不得不认为有一种方法可以做到这一点,无需绑定类或设置隐藏值。
这是我目前所拥有的:
public ActionResult Contact()
{
SomeViewModel vm = new SomeViewModel();
vm.Questions = workflow.GetQuestions().ToList();
vm.Answers = workflow.GetPossibleAnswers();
return View(vm);//populated radio group
}
[HttpPost]
public ActionResult SendForm(FormCollection form)
{
if (String.IsNullOrEmpty(form["FullName"]))
{
ModelState.AddModelError("FullName", "Must enter a name,");
SomeViewModel vm = new SomeViewModel();
vm.Questions = workflow.GetQuestions().ToList();
vm.Answers = workflow.GetPossibleAnswers();
List<SelectedAnswer> selectedAnswers = ParseSelectedAnswers(form);
vm.PreviousAnswers = selectedAnswers;
return View(vm);//returns without the previously selected radios
}
//more code…
}
public class SomeViewModel : RegisterExternalLoginModel
{
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() ;
}
}
}
}
解析方法
private List<SelectedAnswer> ParseSelectedAnswers(FormCollection form)
{
List<SelectedAnswer> selectedAnswers = new List<SelectedAnswer>();
var questionElements = form.AllKeys.Where(t => t.StartsWith("Questions["));
var uniqueQuestionElements = questionElements.Select(t=> t.Substring(0, t.IndexOf(']') +1)).Distinct();
var count = uniqueQuestionElements.Count();
foreach(var element in uniqueQuestionElements)
{
long x = ParseElementToLong(form, element, "ObjectId");
long y = ParseElementToLong(form, element, "SelectedAnswer");
selectedAnswers.Add(new SelectedAnswer() { questionId = x, answerId = y });
}
return selectedAnswers;
}
所以,问题是视图在 ModelError 之后返回,没有任何问题、答案或检查过的无线电。
我正在使用带有 Razor 的 MVC 5。
【问题讨论】:
标签: c# asp.net asp.net-mvc http-post radio-group