"best" 交替处理 Post 和获取操作的方法是什么?
What is the "best" way to handle alternately Post and Get Actions?
我正在尝试构建非常简单的东西,但我尝试以正确的方式进行。但我很难找出什么是最好的。
我有一个流程链,用户必须在其中以不同的形式填写一些字段。有时这取决于用户输入的用户接下来显示的表单。
[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();使用此虚拟机。现在我认为这是 "best" 解决方案,但我觉得这很费力...
根据讨论,我建议根据您的喜好使用:
1) 在每个表单 post 的末尾保存到数据库,并且按照您的建议使用 I'd 重定向到 GET。
2)根据表单页面的数量和您的要求,检索表单需要的值将是标准做法。这样可以确保如果用户在任何阶段退出表单,您都可以从他们离开的地方开始。
3) 我不会在前一个 post 中为下一个表单设置视图模型。通常,作为单一责任原则的一部分,您希望确保您的方法只有一个改变的理由。
4) PostRedirectGet 模式应该用这个实现,以确保如果用户在 post.
后刷新,数据不会被多次保存
我正在尝试构建非常简单的东西,但我尝试以正确的方式进行。但我很难找出什么是最好的。
我有一个流程链,用户必须在其中以不同的形式填写一些字段。有时这取决于用户输入的用户接下来显示的表单。
[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();使用此虚拟机。现在我认为这是 "best" 解决方案,但我觉得这很费力...
根据讨论,我建议根据您的喜好使用:
1) 在每个表单 post 的末尾保存到数据库,并且按照您的建议使用 I'd 重定向到 GET。 2)根据表单页面的数量和您的要求,检索表单需要的值将是标准做法。这样可以确保如果用户在任何阶段退出表单,您都可以从他们离开的地方开始。 3) 我不会在前一个 post 中为下一个表单设置视图模型。通常,作为单一责任原则的一部分,您希望确保您的方法只有一个改变的理由。 4) PostRedirectGet 模式应该用这个实现,以确保如果用户在 post.
后刷新,数据不会被多次保存