我有一个主页,上面有一个注销链接。当用户点击链接时,我调用以下方法:
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();
}
现在,当用户在页面上并且他们单击链接时,会发生正常的页面循环并调用此方法。
问题,这是因为用户不必等待页面循环,应该尽快将它们带到注销页面(只要运行服务器上的注销方法。
如何跳过页面生命周期,但仍然调用此方法?
感谢。
答案 0 :(得分:4)
问题在于用户不必等待页面循环
我认为问题是页面显然在页面循环中做太多。在WebForms中,页面循环发生。这就是它的工作原理。考虑一下......
没有看到任何实际的代码,我的直觉反应是你在Page_Load
做了太多。重构它。只需执行加载 页面所需的操作。不处理数据,不进行各种后端工作,只需加载页面即可。这应该是一个相当轻松的过程。然后在适当的时候逻辑插入必要的背景工作。 (在WebForms中,这是我的一个主要问题,这通常最终会包含很多条件以检查IsPostBack
。)
现在,是你可以做的事情。根据您的问题,听起来您想要跳过的是加载当前页面,而是直接进入注销页面。根据您的设置,您可以采用以下几种方法:
LinkButton
一样)。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)
调用完全不同的页面,该页面仅执行注销任务而不执行其他相关代码。这样,您就不必担心页面生命周期。