1

我有一个自定义的 HttpModule,它可以处理用户是否需要支付发票。如果用户进行了回发,但在我的 HttpModule 的发票部分被“捕获”,我想在支付发票后重新发布用户进行的原始回发,因此用户不必开始超过。

例子:

  1. 用户填写表单并将其提交给服务器
  2. HttpModule 识别用户有未付发票,并将用户重定向到支付页面
  3. 用户支付账单
  4. 第1点的原帖被转发,用户可以继续

我尝试在会话状态中保存 HttpContext(来自 HttpContext.Current)并将 HttpContext.Current 设置为会话中的值,当账单已支付时,但它不起作用。

HttpModule 中断正常流程后是否可以重用回发?

我的 HttpModule 看起来像这样: class UnpaidInvoiceHttpModule : IHttpModule { private HttpApplication cHttpApp;

    public void Dispose(){}

    public void Init(HttpApplication context)
    {
        cHttpApp = context;
        context.PreRequestHandlerExecute += new EventHandler(CheckForUnpaidInvoices);
    }

    private void CheckForUnpaidInvoices(Object s, EventArgs e)
    {
        if (HttpContext.Current.Request.Path.EndsWith(".aspx") || HttpContext.Current.Request.Path.EndsWith(".asp") || HttpContext.Current.Request.Path == "/")
        {
            if (HttpContext.Current.Request.Path != "/login.aspx" 
                && HttpContext.Current.Request.Path != "/Payment/Default.aspx"
                && HttpContext.Current.Request.Path != "/Payment/Default_notice.aspx" 
                && HttpContext.Current.User != null)
            {
                if (HttpContext.Current.User.Identity.IsAuthenticated)
                {
                    CustomUser mUser = ManagerSecurity.SecurityAPI.GetUser();      
                    if (mUser.HasUnpaidInvoices)
                    {
                        HttpContext.Current.Session["prepaymentHttpContext"] = HttpContext.Current;
                        HttpContext.Current.Response.Redirect("/Payment/Default.aspx");
                    }
                    else
                    {
                        if (HttpContext.Current.Session["prepaymentHttpContext"] != null)
                        {
                            HttpContext.Current = (HttpContext)HttpContext.Current.Session["prepaymentHttpContext"];
                        }
                    }
                }
            }
        }
    }
}
4

1 回答 1

2

此链接应为您提供执行您描述的操作所需的一切。请注意,此解决方案不会延迟发布。它立即将数据重新发布到不同的页面。您必须修改它以将名称/值集合存储在某处(可能在发票页面上的 ViewState 中,或在数据库中),以便在支付发票后可以再次提取它。支付发票后,您可以提取名称-值集合并将其传递给“重定向和发布”方法,以使用户回到原来的目的地。

于 2012-04-30T23:05:35.220 回答