0

我正在使用以下内容来控制用户登录身份验证。当用户处于非活动状态或被锁定时,此重定向很好,但是当用户从数据库中删除时,我收到一条错误消息......

此行上的“对象引用未设置为对象的实例”...

If currentuser IsNot Nothing And currentuser.IsApproved = False Or currentuser.IsLockedOut = True Then

什么可能导致这种情况发生?

Protected Sub Page_Init(sender As Object, e As System.EventArgs) Handles Me.Init

    If User.Identity.IsAuthenticated Then

        Dim currentuser As MembershipUser = Membership.GetUser()

        If currentuser IsNot Nothing And currentuser.IsApproved = False Or currentuser.IsLockedOut = True Then
            FormsAuthentication.SignOut()
            FormsAuthentication.RedirectToLoginPage()
        End If

        If currentuser IsNot Nothing Then
            Response.Redirect("~/media")
        End If

    End If

End Sub
4

3 回答 3

1

由于 'And' 优先于 'Or' 表达式将按如下方式计算:

If
{ 
  currentuser IsNot Nothing And currentuser.IsApproved = False //condition 1
  Or 
  currentuser.IsLockedOut = True //condition 2
}
Then..

如果当前用户实际上什么都不是:条件 1- 不会失败,但条件 2 将抛出异常,因为代码正在尝试评估(nothing).somthing.

要解决此问题,您必须添加括号,如下所示:

If
  currentuser IsNot Nothing //condition 1
  And 
  (currentuser.IsApproved = False Or currentuser.IsLockedOut = True) //condition 2
Then.. 

现在,只有当第一个条件为真时,才会评估第二个条件。

于 2013-08-11T01:22:23.500 回答
1

将条件更改If为:

If currentuser IsNot Nothing Then
  If currentuser.IsApproved = False Or currentuser.IsLockedOut = True Then
    FormsAuthentication.SignOut()
    FormsAuthentication.RedirectToLoginPage()
  End If

  Response.Redirect("~/media")
End If
于 2013-08-11T01:03:24.410 回答
1

您需要对第二部分进行分析并使用OrElse/AndAlso,否则currentuser IsNot Nothing 将不适用于您的所有部分if

所以这将解决它:

If currentuser IsNot Nothing AndAlso (Not currentuser.IsApproved OrElse currentuser.IsLockedOut) Then

不要使用Or(and AND) 但OrElse(and AndAlso) 会短路。这意味着如果第一部分已经是,它将不会评估第二部分trueOr(和And)在另一边总是会评估这两个部分。

于 2013-08-11T01:11:13.000 回答