1

我有一个包含多个页面的网站,不一定是分层的。我想在用户第一次进入站点时查询用户的身份(使用 AD ...),并根据需要创建会话状态变量以方便其他页面。用户可能无需通过 default.aspx 页面即可进入该站点,因此我想我应该将代码放在母版页的代码隐藏中。

假设这是一个好主意,与维护此信息的某种静态类相比,我开始设置它,但发现母版页代码隐藏在我进入站点时似乎并不总是被触发。这是调试现象,还是我是对的,而母版页是放置此代码的错误位置...?

4

1 回答 1

0

我会推荐使用 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 来设置用户数据(我只是出于此问题范围之外的其他原因才这样做)。

祝你好运。

于 2013-02-26T16:46:17.657 回答