交替处理发布和获取操作的“最佳”方法是什么?

时间:2018-12-31 14:02:35

标签: asp.net post get asp.net-core-2.0 actionmethod

我正在尝试构建非常简单的东西,但是我尝试以正确的方式来做。但是我很难弄清楚什么是最好的。

我有一个流程链,用户必须以不同的形式填写某些字段。有时,这取决于用户输入的内容,接下来显示用户的形式。

[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。现在,我认为这是“最佳”解决方案,但是我觉得这很费力...

1 个答案:

答案 0 :(得分:1)

根据讨论情况,我建议根据您的喜好使用:

1)在每个表单发布的末尾保存到db,并按照您的建议使用I重定向到GET。 2)根据表单页面的数量和您的要求,在获取表单时获取表单所需的值将是标准做法。这样可以确保,如果用户在任何阶段下达表单,都可以在他们离开的地方将其启动。 3)我不会在前一个帖子的下一个表单中设置视图模型。通常,作为单一责任原则的一部分,您要确保您的方法只有一个改变的理由。 4)应该以此实现PostRedirectGet模式,以确保如果用户在发布后刷新,则不会多次保存数据。