2013-08-11 3 views
0

J'utilise ce qui suit pour contrôler l'authentification de connexion utilisateur. Cela redirige bien lorsque l'utilisateur est inactif ou verrouillé, mais lorsque l'utilisateur est supprimé de la base de données, un message d'erreur s'affiche ...Asp.net - Référence d'objet non définie sur une instance d'un objet

"Référence d'objet non définie sur une instance d'un objet" sur cette ligne. ..

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

Qu'est-ce qui pourrait être à l'origine de cette situation?

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 

Répondre

1

Modifier la condition 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 
+0

merci beaucoup .. fonctionne! –

1

Vous devez parathesize la deuxième partie et utiliser OrElse/AndAlso, sinon currentuser IsNot Nothing ne sera pas appliquée à toutes les parties de votre if

donc ça réparez-le:

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

N'utilisez pas Or (et AND) mais OrElse (et AndAlso) qui court-circuitera. Cela signifie qu'il n'évaluera pas la deuxième partie si la première partie était déjà true. Or (et And) de l'autre côté permettra d'évaluer les deux parties toujours.

+0

Merci pour le conseil! –

1

Depuis « Et » reçoit la priorité sur « Ou » l'expression sera évalué comme suit:

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

Si l'utilisateur actuel est en fait rien: état 1 ne manquera pas, mais la condition 2 sera jeter une exception puisque le code tente d'évaluer (nothing).somthing.

pour résoudre le problème, vous devrez ajouter entre parenthèses comme indiqué:

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

Maintenant, la 2ème condition ne sera évaluée que si la première condition est vraie.

Questions connexes