1

以下是母版页与内容页合并时事件发生的顺序:

http://msdn.microsoft.com/en-us/library/dct97kc3.aspx

所以,我的问题是:

我有一个登录页面(不使用母版页)、一个母版页和数百个内容页面。

我在主页面中检查登录会话Session["loggedInUser"](如果未登录,则重定向到登录页面)

所以,当我不登录时,如果我输入一个内容页面的地址,它必须在母版页中检查登录会话并重定向到登录页面,对吗?但这里有两种情况:

如果在内容页面中,我不使用任何与 相关的东西Session["loggedInUser"],它会重定向到登录页面,所以,这里没关系!

第二种情况:如果我使用Session["loggedInUser"]在内容页面中显示用户名,例如:

UserInfo loggedInUser = (UserInfo)Session["loggedInUser"];

它将在这里返回 null 对象,因为page_loadin content 页面page_load在 master page之前被触发,所以它会抛出 null 对象而不是重定向到登录页面。

Page_PreInit我也在母版页中尝试过,但没有帮助

protected void Page_PreInit(object sender, EventArgs e)
{
    if (Session["loggedInUser"] == null)
    {
        Response.Redirect("~/Login.aspx");
    }
}

有什么建议吗?

4

4 回答 4

1

您可以Session["loggedInUser"]在内容页面中检查Page_PreRender()而不是Page_Load(),或者,在母版页中检查Page_Init()而不是Page_Load()。我们遇到了同样的问题并选择了母版页Page_Init()选项,这样我们仍然可以Page_Load()在所有内容页面中使用。

编辑:Page_Init() 不是 PreInit()

于 2011-05-09T08:08:56.233 回答
1

大概,当您说您正在使用该Session["loggedInUser"]值时,您是在调用.ToString()方法或类似方法来显示它吗?

在这种情况下,您需要在使用前检查空对象。在任何情况下,在使用任何方法之前检查对象是否存在是最佳实践,因此:

if (Session["loggedInUser"] != null)
{ ... }

只有当您确定在没有实例化 Session 对象的情况下永远不会执行代码时,您才能使用方法而不检查空引用。

http://msdn.microsoft.com/en-us/library/03sekbw5.aspx

于 2011-05-09T08:24:07.347 回答
1

最后我想出了一个解决方案:

我创建了一个这样的类BasePage

public class BasePage : System.Web.UI.Page
{
    protected override void OnLoad(EventArgs e)
    {
        if (Session["loggedInUser"] == null)
        {
            Response.Redirect("~/Login.aspx");
        }
        base.OnLoad(e);
    }
}

在内容页面中,我没有继承 from Page,而是更改为BasePage并且它完美地工作

感谢大家的支持

美好的一天;)

于 2011-05-09T10:26:09.300 回答
0

我有 2 个母版页(1 个用于登录前,2 个用于登录后),主页是独立的,注销页面继承登录后页面)在所有登录后页面会话中,如果 sessionnull(xyz)else(重定向登录页面)所有这些都在 afterlogin.master 的 Page_Init 事件中。 ......成功

于 2013-11-20T13:31:15.060 回答