防止页面生命周期?

时间:2011-12-29 17:21:26

标签: c# asp.net page-lifecycle

我有一个主页,上面有一个注销链接。当用户点击链接时,我调用以下方法:

    private void Logout()
    {
        SessionBll.DeleteSessionEntry(this.sessionId);
        FormsAuthentication.SignOut();
        Roles.DeleteCookie();
        LogHelper.Location = string.Empty;

        LogHelper.Info(logger, HttpContext.Current.User.Identity.Name, 
           MethodBase.GetCurrentMethod().Name, "User has been logged out from 
                Administrator.Master", LogMessage.LoggedOut);
        FormsAuthentication.RedirectToLoginPage();
    }

现在,当用户在页面上并且他们单击链接时,会发生正常的页面循环并调用此方法。

问题,这是因为用户不必等待页面循环,应该尽快将它们带到注销页面(只要运行服务器上的注销方法。

如何跳过页面生命周期,但仍然调用此方法?

感谢。

4 个答案:

答案 0 :(得分:4)

  

问题在于用户不必等待页面循环

我认为问题是页面显然在页面循环中做太多。在WebForms中,页面循环发生。这就是它的工作原理。考虑一下......

  • 为了与代码隐藏进行交互,客户端表单需要POST到页面。
  • 为了处理POST,页面需要存在于内存中。
  • 为了存在,页面需要在其生命周期中完成标准的创建步骤。

没有看到任何实际的代码,我的直觉反应是你在Page_Load做了太多。重构它。只需执行加载 页面所需的操作。不处理数据,不进行各种后端工作,只需加载页面即可。这应该是一个相当轻松的过程。然后在适当的时候逻辑插入必要的背景工作。 (在WebForms中,这是我的一个主要问题,这通常最终会包含很多条件以检查IsPostBack。)

现在,你可以做的事情。根据您的问题,听起来您想要跳过的是加载当前页面,而是直接进入注销页面。根据您的设置,您可以采用以下几种方法:

  • 使注销链接只是一个简单的链接。这样浏览器只会请求退出页面,而不是将表单POST发送到当前页面(就像使用按钮或LinkButton一样)。
  • 如果注销页面实际上需要某种值的POST,请将其设置为自己的HTML form,并将操作设置为注销页面。这涉及减少对服务器端拖放控件的依赖,而不仅仅是制作一些简单的HTML(在Web开发中总是一件好事)。

或者,再考虑一下您的问题,您是否在询问如何使注销页面跳过母版页的循环?如果注销页面使用母版页,则它不能跳过它。页面必须存在才能使用。但是你可以创建一个没有母版页的独立注销页面,只做处理注销(然后重新定向到另一个页面)。这将快速处理注销,但总体上仍然需要在某处加载页面。这让我们回到了问题是指页面加载时间太长而不是您正在加载页面。

答案 1 :(得分:1)

您不能跳过页面生命周期;你可以做的是:

logout链接更改为普通链接(<a href="...">)和Page_Load页面的Login,执行您发布的代码但仅if(!IsPostBack)

修改

如果您的登录页面需要知道(如您所说)何时执行清理代码;您可以在注销链接上传递参数,如下所示:

<a href="Login.aspx?Logout=y" > Logout </a>

然后检查Page_Load:

if (!IsPostBack &&  Request.QueryString["Logout"]=="Y" )
{
   //Your code here
}

这是非常快的。

答案 2 :(得分:1)

使用没有生命周期的东西 - 像某人建议的ASP.NET MVC或创建.ashx(处理程序):logout.ashx只会注销登录用户。无需更改框架即可实现。

通常不会这样做,通常你会使用一个不同的页面,这个页面仍然有一个完整的生命周期(根据伊卡洛斯的回答)。

答案 3 :(得分:1)

调用完全不同的页面,该页面仅执行注销任务而不执行其他相关代码。这样,您就不必担心页面生命周期。