2015-11-21 6 views
0

Я создаю двойную форму входа, которая аутентифицирует пользователя на основе их роли и перенаправляет их на определенную страницу на основе их имени пользователя и пароля. Я был первоначально используя FormsAuthentication.RedirectFromLoginPage для обработки переназначение, но я обнаружил, что я могу перенаправить только на одну страницу после успешного входа в систему с использованием аутентификации наОбъект нельзя передать из DBNull другим типам, если пароль или имя пользователя не найдены

<forms defaultUrl="~/InteriorStudentPortal.aspx" loginUrl="~/ExteriorLogin.aspx" slidingExpiration="true" timeout="2880"></forms> 

в моем web.config. Вместо этого я использую простое свойство Response.Redirect("~/InteriorStudentPortal.aspx") в обратном коде страницы входа. Теперь, когда пользователь вводит неправильное имя пользователя или пароль, я получаю ошибку Object cannot be cast from DBNull to other types, которая обычно обрабатывается FormsAuthentication. Что я могу добавить к моему обратному коду или хранимой процедуре для обработки этого исключения?

Вот один из моих сохраненных проков:

CREATE PROCEDURE [dbo].[Validate_Student] 

     @Username NVARCHAR(50), 

     @Password NVARCHAR(50) 

AS 

BEGIN 

     SET NOCOUNT ON; 

     DECLARE @StudentID INT, @LastLoginDate DATETIME 



     SELECT @StudentID = StudentID, @LastLoginDate = LastLoginDate 

     FROM Student WHERE [Username] = @Username AND [Password] = @Password 



     IF @Username IS NOT NULL 

     BEGIN 

     UPDATE Student 

     SET LastLoginDate = GETDATE() 

     WHERE StudentID = @StudentID 

     SELECT @StudentID [StudentID] -- User Valid 

     END 

     BEGIN 

      SELECT -1 -- User invalid. 

     END 

END 

Наряду с задним кодом:

Protected Sub ValidateStudent(sender As Object, e As AuthenticateEventArgs) Handles Login1.Authenticate 
     Dim studentId As Integer = 0 
     Dim constr As String = ConfigurationManager.ConnectionStrings("DatabaseConnectionString").ConnectionString 

      Using con As New SqlConnection(constr) 
       Using cmd As New SqlCommand("Validate_Student") 
        cmd.CommandType = CommandType.StoredProcedure 
       cmd.Parameters.AddWithValue("@Username", Login1.UserName) 
        cmd.Parameters.AddWithValue("@Password", Login1.Password) 
        cmd.Connection = con 
        con.Open() 
       studentId = Convert.ToInt32(cmd.ExecuteScalar()) 
        con.Close() 
       End Using 
      Select Case studentId 
       Case -1 
        Login1.FailureText = "Username and/or password is incorrect." 
        Exit Select 
       Case Else 
        Response.Redirect("~/InteriorStudentPortal.aspx") 
        Exit Select 
      End Select 
      End Using 
    End Sub 

Ошибка возникает на studentId = Convert.ToInt32(cmd.ExecuteScalar()) линии. Любая помощь была бы весьма признательна, и я был бы рад предоставить любую дополнительную информацию.

ответ

1

Вы можете проверить DBNull как ниже

studentId = If(IsDBNull(cmd.ExecuteScalar()), 0, Convert.ToInt32(cmd.ExecuteScalar())) 

и изменить

Select Case studentId 
     Case -1 
     Login1.FailureText = "Username and/or password is incorrect." 
     Exit Select 
     Case 0 
     Login1.FailureText = "Username and/or password is incorrect." 
     Exit Select 
     Case Else 
     Response.Redirect("~/InteriorStudentPortal.aspx") 
     Exit Select 
End Select 

или вы можете использовать IF ELSE вместо CASE

If studentId > 0 Then 
    Response.Redirect("~/InteriorStudentPortal.aspx") 
Else 
    Login1.FailureText = "Username and/or password is incorrect." 
End If 
+1

Спасибо за быстрый ответ. Это сделал трюк! – NOSDUH

+0

@NOSDUH Да, на самом деле, это ужасный ответ: [VB.NET - Слепой, ведущий слепой - IIf] (https://dotnetfiddle.net/bJxrFe) –

+0

@NOSDUH ответ обновлен, В случае, если вы поймали любое исключение –

 Смежные вопросы

  • Нет связанных вопросов^_^