在发布后维护已检查的无线电组

本文关键字:检查 无线电 维护 | 更新日期: 2023-09-27 18:10:56

我如何在一个返回错误的帖子之后不仅维护一个无线电组的问题和答案,而且还要维护选中的无线电?

Contact页面返回一个选择题列表。如果出现错误,则视图不包含答案或所选值。

我四处寻找,但没有找到一个答案,完全把它放在一起。这个很接近:我如何在ASP中的POST请求之间传输ViewModel数据?净MVC吗?

但我不能相信四年后没有一个更容易的解决方案。

Ken说:

可以获取当前选中的项(即验证失败)包含发布并绑定到的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之后返回,没有任何问题、答案或已检查的无线电。

我使用MVC 5与Razor。

在发布后维护已检查的无线电组

因为你没有发送ViewModel回,使用相同的视图模型你发送到你的视图,并从你的视图接收。

[HttpPost]
public ActionResult SendForm(FormCollection form)
{
    if (String.IsNullOrEmpty(form["FullName"]))
    {
        ModelState.AddModelError("FullName", "Must enter a name,");
        return View(form);
    }
//more code…
}
如果我完全诚实地告诉你,我讨厌我在这里看到的一切…
  • FormCollection到底是什么?
  • 为什么你不创建一个视图模型专门为您的表单?
  • 为什么要在控制器操作中验证表单值?

  • 你可以使用注释,如[Required],它会做你已经手动做的验证。

This will Work.

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();
        return View(vm);//populated radio group
    }
//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() ;
        }
    } 
}
}