如何在asp.net webforms中正确实现PRG模式

我有一个简单的三页asp.net webforms网站,并且有一个问题,后面的浏览器按钮会弹出弹出窗口“…… Firefox必须发送任何可以重复任何操作的信息..”当回到step3.aspx时。

流程为:用户登陆step1.aspx,会话启动,用户在产品上引用并重定向到step2.aspx。 在step2.aspx上,单击asp:按钮确认购买。 OnClick事件处理程序btnPurchase_Click处理购买和重定向的逻辑,Response.Redirect(“step3.aspx”),到step3.aspx。 Step3.aspx只显示确认页面(收据详情)。 会话在步骤3中被销毁,当用户点击后面的浏览器按钮时,会提示他们重新提交post弹出窗口。 理想情况下,我希望用户在没有重新提交提示的情况下点击返回步骤1。 如果会话无效,则每个页面都设置为no-cache并重定向到step1。

有没有人建议更好的流量?

该站点最终将迁移到asp.net mvc / ajax,这很可能使PRG工作流程更容易实现,但是现在,寻找一种相对简单的方法。

一个简单的解决方案是永远不允许页面在回发时呈现,而是接受/存储它发布的任何信息,然后重定向到下一页(或自身)。

这样,如果用户点击后退按钮,它将返回到GET,而不是POST,并避免弹出窗口。

我试试这个问题。 你提到的流程会阻碍页面的正常function,你当然已经想到了这一点。 虽然,我会说它可能是危险的(违背你期望的function)和反效果。 基于我在您的问题中可以看到的内容,我最终会删除Page2和Page3并将所有逻辑保持在同一页面中。

我也很高兴听到你想要避免的事情吗? 这是双职位吗? 就像购物车中的双重内容一样? 部分/不完整的数据输入插入? 通过所描述的影响后退按钮的方法,您可能遇到一个问题,但又会出现另一个问题。 各种各样的浏览器可以在这些解决方案上完全不同。

我看到两个不错的选择,

用户控件,
创建三个UserControl,每个UserControl都有每个页面特定的逻辑。 您可以以编程方式将它们加载到页面中。 即bnButton_Click事件。 Usercontrols使用LoadControl("PathToAscxFileOnDisk.ascx")加载。

面板,
我还会考虑三个或者更好的来放入所有逻辑。

在这种情况下,您可以完全摆脱回发问题,并可以专注于将您的function转移到业务逻辑中,并使用代码文件来控制显示/隐藏的流程,并从面板/用户控件填充/输出控件。 您也可以控制回发/点击URL和按下输入键。

你提到了Ajax,
Ajax绝对可以使您的页面无状态(这意味着您可以在没有缓存,会话,视图状态等的情况下工作。但问题在于用户在页面之间导航的可能性。我认为即使是Ajax也没那么帮助,而你保留三页解决方案。

我个人会说,将aspx文件移动到每个ascx并创建一个aspx作为主容器是一项简单的任务。 使用该选项,您甚至可以避免重复的命名(例如,如果将代码复制/粘贴到面板中),并且使用Page_Load流/逻辑会出现问题。

如果我理解正确你还没有使用PRG。

在第2步,临时存储信息并重定向以显示它。 你如何这样做取决于你的应用程序:会话,数据库,cookie等都是具有不同特征的选项。

然后重定向以显示该信息。

第3步也是如此。

如果你回到第3步,你将转到第2步。但是如果你回到GET请求,就不会有警告。 就像你说的那样,你的应用程序会破坏3上的会话数据,所以根据你的说法,用户会转到第3步。

也许我错过了你说的话。