以下是母版页与内容页面合并时发生事件的顺序:
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");
}
}
有什么建议吗?
答案 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对象时,您可以使用方法而不检查空引用。
答案 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 ................全成