主页和内容页面中的page_load事件

时间:2011-05-09 07:37:00

标签: c# asp.net master-pages content-pages

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

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

所以,我的问题是:

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

我检查母版页中的登录会话Session["loggedInUser"](如果没有登录,则重定向到登录页面)

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

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

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

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

它将返回null对象,因为内容页面中的page_load在主页面中page_load之前被触发,所以它抛出了null对象而不是重定向到登录页面

我还在母版页中尝试Page_PreInit但没有帮助

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

有什么建议吗?

4 个答案:

答案 0 :(得分:1)

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

修改:Page_Init() 不是 PreInit()

答案 1 :(得分:1)

据推测,当您说您使用Session["loggedInUser"]值时,您正在调用.ToString()方法或类似方法来显示它?

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

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

仅当确定代码将从不执行而没有实例化Session对象时,您可以使用方法而不检查空引用。

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

答案 2 :(得分: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);
    }
}

在内容页面中,我改为Page而不是继承BasePage,而且效果很好

感谢您的所有支持

美好的一天;)

答案 3 :(得分:0)

我在所有postloginpage会话chck中有2个masterpages(1个用于prelogin,2个用于afterlogin),主页是独立的,logout页面继承postlogin页面)如果sessionnull(xyz)else(重定向loginpage)所有这些都在afterlogin的Page_Init事件中的.master ................全成