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

时间:2011-09-13 17:27:59

标签: c# .net asp.net webforms post-redirect-get

我有一个简单的三页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中被销毁,当用户点击后面的浏览器按钮时,会提示他们重新提交帖子弹出窗口。理想情况下,我希望用户在没有重新提交提示的情况下点击返回step1。如果会话无效,则每个页面都设置为no-cache并重定向到step1。

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

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

我看到两个不错的选择,

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

面板,
我还要考虑三个<asp:PlaceHolder></asp:PlaceHolder>或者更好<asp:Panel></asp:Panel>来放入所有逻辑。

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

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

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

答案 2 :(得分:2)

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

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

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

第3步也是如此。

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

也许我错过了你说的话。