我有一个包含多个页面的网站,不一定是分层的。我想在用户第一次进入站点时查询用户的身份(使用 AD ...),并根据需要创建会话状态变量以方便其他页面。用户可能无需通过 default.aspx 页面即可进入该站点,因此我想我应该将代码放在母版页的代码隐藏中。
假设这是一个好主意,与维护此信息的某种静态类相比,我开始设置它,但发现母版页代码隐藏在我进入站点时似乎并不总是被触发。这是调试现象,还是我是对的,而母版页是放置此代码的错误位置...?
我有一个包含多个页面的网站,不一定是分层的。我想在用户第一次进入站点时查询用户的身份(使用 AD ...),并根据需要创建会话状态变量以方便其他页面。用户可能无需通过 default.aspx 页面即可进入该站点,因此我想我应该将代码放在母版页的代码隐藏中。
假设这是一个好主意,与维护此信息的某种静态类相比,我开始设置它,但发现母版页代码隐藏在我进入站点时似乎并不总是被触发。这是调试现象,还是我是对的,而母版页是放置此代码的错误位置...?
我会推荐使用 Global.asax 类。如果它不存在,您需要将其添加到您的网络应用程序中。一旦你有了它,你就可以使用各种事件(会话开始和结束、应用程序开始和结束以及错误)来实现特定于你需要的业务逻辑。
我倾向于在 global.asax 的 Application_PreRequestHandlerExecute 事件中使用登录用户。这将允许您查看用户原则(例如 - User.Identity.Name)以查看谁已登录(或者他们是否未登录)并执行您需要的操作(例如为用户设置会话信息, ETC。)。
这是我在一个使用 Global.asax 将用户数据存储在 Session 中的 .NET Web 应用程序上获得的一些代码。
protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e) {
if (Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState) {
SetUserItem();
}
}
private void SetUserItem() {
if (Session["UserItem"] == null)
Server.Execute("~/SetSessionUserObj.aspx", true);
}
...然后是 SetSessionUserObj.aspx.cs
protected void Page_Load(object sender, EventArgs e) {
string ID = User.Identity.Name;
MyUser myUser = new MyUser();
UserItem userItem = myUser.GetUserItemByID(ID);
if (userItem != null) {
Session["UserItem"] = userItem;
}
}
这只是您可以在 global.asax 中访问用户身份的一种方式。您不一定要执行 Server.Execute 来设置用户数据(我只是出于此问题范围之外的其他原因才这样做)。
祝你好运。