发布重定向获取ASP.NET MVC并使用Restful URL进行验证

Fen*_*ton 17 asp.net-mvc post-redirect-get

我有一个用于编辑页面操作的宁静URL.这在控制器上实现为Edit方法,它接受GET请求和接受POST请求的Edit方法.

这意味着您可以访问编辑URL,它将显示GET表单或保存表单以进行POST.

[HttpGet]
public ActionResult Edit(int id) {
    ...
}

[HttpPost]
public ActionResult Edit(EditModel model) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

Post-Redirect-Get(PRG)模式看起来非常黑白,因为它实质上将每个POST重定向回GET动作.但是,我需要确信这是正确的做法.

我的计划是在POST操作中,如果模型有效,我将使用Post-Redirect-Get模式将用户发送到合理的位置(可能是Index或Details操作).

但是,如果存在模型验证问题,我仍然只想显示视图.我不想重定向用户,因为这意味着将模型和ModelState填充到临时数据中并重定向到GET操作 - 然后将逻辑添加到GET操作中以处理临时数据.我可以通过简单地显示视图来避免所有这些.

是的,如果用户按下F5,它将重新提交表单,他们将显示"重新提交警告",但随后是同一页面(要求他们修复验证错误).但是,他们似乎不太可能会遇到F5并且也没有双重提交的危险,因为表单将再次无法通过验证.

如果验证通过,则将重定向用户,并且可以安全地进行双重提交.

那么我应该实现额外的代码并将数据填充到临时数据中以严格遵循PRG模式,还是在表单有效并且存储数据时使用PRG模式更明智?

KP *_*lor 21

如果表单信息有效,您应该只进行重定向; 在提交错误的情况下,从同一个Edit方法返回视图.

这样做,这样符合PRG,因为如果你的模型是无效的,你是不是允许任何更改到服务器上的物体的状态进行.PRG主要用于防止多个帖子以不可预测的方式改变服务器对象(例如,业务对象,数据库表等)的状态; 但是,在您的验证示例中,用户可以根据需要多次重新提交,并且始终将它们发送回初始视图并显示验证错误 - 服务器上的任何内容都不会更改.因此,您说得对:只有在您的模型在表示层中通过验证时才会发出重定向.


Tom*_*han 10

尽管Ken的答案确实突出了一个重要的事实 - PRG并不一定意味着"在发布时盲目地返回重定向" - 您仍然可能希望重定向并保留模型状态.

处理该场景的最简单方法是使用操作过滤器将模型状态导出到会话(重定向之前),然后导入modelstate(在执行新操作之前).Kazi Manzur Ra​​shid几篇关于ASP.NET MVC最佳实践的优秀博客文章(第1 部分第2部分).它们已经很老了,但很多提示仍然非常适用.第一篇文章中的提示编号13 正是您正在寻找的.