如何在ASP.NET WebForms中正确实现PRG模式

4
我有一个简单的三页asp.net webforms网站,并且在使用浏览器返回按钮时遇到了问题,弹出窗口显示“...Firefox必须发送任何会重复任何操作的信息..”,当在step3.aspx页面上点击返回时。
流程如下:用户登录step1.aspx页面,启动会话,并报价某个产品,然后被重定向到step2.aspx。在step2.aspx页面上,您通过单击asp:Button确认购买。OnClick事件处理程序btnPurchase_Click处理购买逻辑并重定向到step3.aspx,Response.Redirect("step3.aspx")。Step3.aspx页面只是显示确认页面(收据详细信息)。会话在step3页面上被销毁,当用户点击浏览器的返回按钮时,会提示重新提交帖子的弹出窗口。理想情况下,我希望用户在点击返回按钮时能够回到step1页面,而不出现重新提交的提示。每个页面都设置为不缓存,并在会话无效时重定向到step1页面。
是否有人对更好的流程有建议?
此网站最终将迁移到asp.net mvc/ajax,这可能会使PRG工作流程更容易实现,但目前正在寻找相对简单的方法。

由于我将走这条路线,所以我已经奖励给了Will。我确实需要在postback时呈现一个页面,因此我需要存储信息并重定向页面。感谢所有的回答。 - Luke Hutton
3个回答

5
一种简单的解决方案是在postback时不允许页面渲染,而是接受/存储所提交的信息,然后重定向到下一个页面(或自身)。
这样,如果用户点击返回按钮,它会回到GET而不是POST,并避免弹出窗口。

我可以重新设计流程来实现这个,只是这样会让我不得不存储服务器端验证错误等信息,所以重定向到自身将显示该信息。我正在考虑采用MVC路线,在tempdata或其他地方存储验证错误。这个应用程序已经是混合应用程序了,着陆页面是MVC,所以我可能会完成迁移。谢谢。 - Luke Hutton

2
如果我理解正确,您还没有使用PRG。
在第2步中,暂时存储信息并重定向以显示它。如何做取决于您的应用程序:会话、数据库、cookie等都是具有不同特征的选项。
然后重定向以显示该信息。
第3步也是一样的。
如果您在第3步上点击返回,则会回到第2步。但是,由于您返回到GET请求,因此不会出现警告。就像您所说的那样,您的应用程序会在第3步销毁会话数据,因此根据您所说的,用户将转到第3步。
也许我在您所说的内容上有所遗漏。

谢谢,你说得对。这与Will的答案非常相似,但更详细。我已经尝试过,以便第2步始终重定向。我只需要存储信息,以便在重定向时正确显示。我在第2步中有一个“获取我的个人资料”按钮和验证错误。我曾在PRG中使用过,但不是在所有正确的地方,因此会出现后退按钮重新提交提示,但现在我明白您始终需要重定向,而不是任何后退操作。 - Luke Hutton

2
我来试着回答这个问题。你提到的流程会阻碍页面的正常功能,这点你当然已经有了考虑。但是,我认为这可能是危险的(与您期望的功能相反)并且适得其反。根据我从您的问题中看到的内容,我肯定会删除Page2和Page3,并将所有逻辑保留在同一个页面上。
我也很乐意听听你想要避免什么?是双重发布吗?例如购物车中内容的重复发布?数据输入的部分/不完整插入?通过描述的方式影响返回按钮,您可能会解决一个问题,但会引发另一个问题。许多浏览器可能会对此类解决方案产生完全不同的反应。
我看到两个好的选项,
用户控件, 创建三个用户控件,每个控件都有各自的页面特定逻辑。您可以在页面上以编程方式加载它们。即在bnButton_Click事件上。用户控件使用LoadControl("PathToAscxFileOnDisk.ascx")加载。
面板, 我还想考虑三个<asp:PlaceHolder></asp:PlaceHolder>或者更好的是<asp:Panel></asp:Panel>,将所有逻辑放入其中。
在这种情况下,您完全不必担心回发问题,并可以专注于将功能移动到业务逻辑中,并使用Code-File控制显示/隐藏和从面板/用户控件填充控件。您还可以控制回发/单击URL和按Enter键。
你提到了Ajax, Ajax绝对可以使您的页面无状态(这意味着您可以在没有缓存、会话、视图状态等的情况下工作)。但是,问题在于用户可以在页面之间导航的可能性。我认为即使使用Ajax,您仍然需要保留三页解决方案。
我个人认为,将aspx文件移动到每个ascx中并创建一个aspx作为主容器是一项简单的任务。通过这种选项,您甚至可以避免重复命名(例如,如果您将代码复制/粘贴到面板中)和Page_Load流/逻辑的麻烦。

感谢您的输入。我不害怕重复发布,因为我已经确认在Page3上按返回并在重新提交帖子弹出窗口上按OK确实会将您带回Page1(至少对于FF而言)。我只是不想显示此重新提交弹出窗口。您提出的解决方案很有趣,我可能会尽快研究一下。 - Luke Hutton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接