带有发布/重定向/获取的 ASP.NET 向导

Posted

技术标签:

【中文标题】带有发布/重定向/获取的 ASP.NET 向导【英文标题】:ASP.NET Wizard with Post/Redirect/Get 【发布时间】:2011-05-19 19:45:37 【问题描述】:

我已经习惯了 Post/Redirect/Get 模式,我发现它是一个非常好的过程,而且它似乎也让我更多地考虑页面结构而不是依赖 ASP.Net 事件太频繁了。

我目前正在为一个站点编写一个向导功能,虽然没有使用 ASP.NET 向导控件,但使用 MultiView 更手动地处理它。通常,在过去,对于向导的每个连续步骤,我都希望典型的用户体验是 GET > POST > POST > POST 等。但是我现在正在考虑使用更 P/D/G 的方法,人们是否经常与他们的巫师一起这样做?

我目前的想法是,一旦用户完成了一个步骤并选择继续,包含当前向导信息的会话对象将被保存回会话,然后 GET 重定向将返回向导页面。当向导页面加载时,会询问 Session 对象以确定向用户显示的正确步骤。

我可以看到这有两个好处:

    它具有 P/R/G 的通常优点,它消除了 刷新问题 并且还 用户可以离开向导并返回到它(如果他们的会话仍处于活动状态),他们将被直接带到正确的步骤。

人们认为这是一种更简洁的设计吗?有明显的缺点吗?我在想我可能会变成一个愤世嫉俗的程序员,并更少信任 ASP.Net 和 Postback 生命周期,但这并不是说这种方法会产生更多代码?如果我没有实现它,我将不得不针对用户刷新或尝试导航到他们不应该执行的步骤写入所有检查。

【问题讨论】:

【参考方案1】:

是的,这是一个更简洁的设计。

唯一的缺点是额外的往返(用于重定向)和slightly increased complexity of displaying status messages。

我不再向用户返回 POST 结果。

【讨论】:

我仍在考虑让 POST 结果在验证失败时返回给用户,以便以更简单的方式显示错误消息。由于在那种情况下不会更新域模型,所以重复的 POST 尝试应该没有任何后果?我通常只为成功的 POST 使用重定向,我应该重新考虑一下吗? 我不希望这样做,因为它需要在您的页面中添加额外的条件逻辑,这使得它们更难维护,但它可能是可辩护的(特别是作为中间步骤)。最近我刚刚在用户会话中使用了一条消息Stack 来处理这类事情。 (ASP.NET MVC 在TempData 中有类似的东西。)【参考方案2】:

您所描述的方法的一个问题是没有“返回”功能,这是威世智的典型期望。另外,请注意,有人可能希望能够在不同的浏览器选项卡中同时通过向导的多个“会话”,而您的系统会阻止这种情况。

“返回”功能可以包含在“返回”链接/按钮中的特殊查询字符串值中,该值指示会话存储的对象备份一个步骤。一个会话中的多个实例将需要更多的参与;也许只是将数据存储在视图状态中,或者为“向导实例”创建一个键。或者,您可能决定在任何时候只支持单个向导实例运行。 (诚​​然,有人试图同时运行多个向导实例可能是极其罕见的情况)

【讨论】:

感谢您的回复。有问题的向导是一个付款程序,他们将无法运行它的多个会话。当每个回发发生以完成一个步骤时,它将阻止它再次发生(所以他们不能说,尝试在两个不同的选项卡中完成两次付款)。 对于后台功能,我允许他们重新访问旧步骤来修改细节。我持有的状态将反映“最新状态”,因此他们将被允许访问导致该步骤的任何步骤以修改数据。

以上是关于带有发布/重定向/获取的 ASP.NET 向导的主要内容,如果未能解决你的问题,请参考以下文章

使用 c# 在 asp.net 中集成 paypal

在 ASP.NET 中使用带有友好 URL 的 Response.Redirect

处理 OAuth 2.0 身份验证 - 在 ASP.NET MVC 应用程序中获取令牌重定向令牌响应

如何将 MVC5 RedirectResult () 重定向到 Asp.net 中的整页?

通过引导模式对话框结果重定向浏览器的 ASP.Net MVC 文件上传

AWS负载均衡器后面的ASP.NET Core 2.1 HTTPS重定向?