我正在尝试构建非常简单的东西,但是我尝试以正确的方式来做。但是我很难弄清楚什么是最好的。
我有一个流程链,用户必须以不同的形式填写某些字段。有时,这取决于用户输入的内容,接下来显示用户的形式。
[HttpGet]
public IActionResult Form1(Form1Vm f1vm)
{
return View(f1vm);
}
[HttpPost]
[ActionName("Form1")]
public IActionResult Form1Post(Form1Vm f1vm)
{
//process the data etc
//prepare the new viewmodel for the next form view (f2vm)
//Option1:
return View("Form2", f2vm);
//Option2:
return RedirectToAction("Form2", f2vm);
//for Option 2 I would need an additional HttpGet Action Method in which I
//would have to call Modelstate.Clear(); in order to not have the
//immediate validation errors on page load
//also all the properties of my viewmodel are passed as get parameters
//what looks pretty nasty for me
}
//More form views action methods should be added here...:
有什么更好的方法?正如我在上面的评论中所提到的,使用RedirectToAction选项存在很大的不利之处。但是,如果我直接使用View();致电,我对https://en.wikipedia.org/wiki/Post/Redirect/Get不在乎,并且用户不能简单地刷新页面而不会收到警告,提示其表单已再次提交。
我会错过另一种方式还是看不到明显的东西吗?
编辑:我只是想过一种第三种方法,这种方法我经常看到:不将整个VM转移到HttpGet方法,而只转移给ID。然后,我必须直接从数据库加载先前存储的所有数据,再次将其映射到我的新VM,然后调用View();。与此VM。现在,我认为这是“最佳”解决方案,但是我觉得这很费力...
答案 0 :(得分:1)
根据讨论情况,我建议根据您的喜好使用:
1)在每个表单发布的末尾保存到db,并按照您的建议使用I重定向到GET。 2)根据表单页面的数量和您的要求,在获取表单时获取表单所需的值将是标准做法。这样可以确保,如果用户在任何阶段下达表单,都可以在他们离开的地方将其启动。 3)我不会在前一个帖子的下一个表单中设置视图模型。通常,作为单一责任原则的一部分,您要确保您的方法只有一个改变的理由。 4)应该以此实现PostRedirectGet模式,以确保如果用户在发布后刷新,则不会多次保存数据。