主页和内容页面中的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对象的情况下永远不会执行代码时,您才能使用方法而不检查空引用。
最后,我想出了一个解决方案:
我像这样创建一个类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页面)。 ……………全成