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

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

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

所以,我的问题是:

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

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

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

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

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

 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"); } } 

有什么建议吗?

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

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

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

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

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

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

我像这样创建一个类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); } } 

在内容页面中,我改为BasePage而不是inheritance自Page ,而是完美无缺

感谢您的支持

美好的一天;)

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

编辑:它是Page_Init() 而不是 PreInit()

在postlogin.master的Page_Init事件中,如果sessionnull(xyz)else(重定向登录页面)所有这一切,我在所有postloginpage会话chck中有2个masterpages(1个用于prelogin,2个用于afterlogin),主页是独立的,logout页面inheritancepostlogin页面)。 ……………全成