4

在 ASP.Net 中,我试图在 Login 控件的 LoggedIn 事件中获取刚刚登录的用户的 UserId(即用户 GUID)。也就是说,我想在用户移动到下一页之前获取 UserId。这是我正在使用的代码:

Protected Sub Login1_LoggedIn(ByVal sender As Object, _
  ByVal e As System.EventArgs) Handles Login1.LoggedIn

    Dim UserId As String
    UserId = Membership.GetUser.ProviderUserKey.ToString()

End Sub

但是,我收到“对象引用未设置为对象的实例”错误。当我在后续页面中使用相同的代码时,当登录的用户访问这些页面时,同样的代码运行良好。

4

1 回答 1

12

ScottGu有这个问题的答案,正如ASP.NET 论坛上的这篇博文中所解释的:

LoggedIn 事件在用户使用登录控件登录后立即触发——但不会在对站点的下一个请求之前触发。因此,尚未填写 User 对象。

如果您将代码更改为:

Dim UserId As String
UserID = Membership.GetUser(Login1.UserName).ProviderUserKey.ToString()

它应该可以正常工作。Membership.GetUser在不传递用户名作为参数的情况下调用将期望获取“当前”登录用户。当然,由于上述原因,这会失败,因为该User对象尚未填充。通过将Login控件的UserName属性作为参数传递给该GetUser()方法,您可以显式强制该Membership.GetUser方法从用户存储(即数据库)中检索由名称指定的用户。这可确保该Membership.GetUser方法返回一个MembershipUser允许您访问该ProviderUserKey属性的有效对象。

于 2009-10-21T10:02:38.907 回答