1

ロールをチェックするログインフォームがあり、資格情報が満たされると、ユーザーは特定のページに誘導されます。私の問題は、ユーザー名またはパスワードが正しくない場合、デザインにあるラベルを介してロジックがユーザーにプロンプ​​トを表示できないことです。Try/Catch を介して実装しようとしましたが、それでも同じ結果が得られました。

デザイン:

<div><asp:Label ID="lblinfo" runat="server" Width="374px" CssClass="blktext"></asp:Label></div>

(ボタン イベント ハンドラ) の背後にあるコード:

 Try
            Dim con As New SqlConnection(GetConnectionString())
            con.Open()

            Dim cmd As New SqlCommand("Check_Users", con)
            cmd.CommandType = CommandType.StoredProcedure

            Dim p1 As New SqlParameter("Login_name", username.Text)
            Dim p2 As New SqlParameter("Login_Pwd", password.Text)

            cmd.Parameters.Add(p1)
            cmd.Parameters.Add(p2)
            Dim rd As SqlDataReader = cmd.ExecuteReader()

            'check the Role of the user logging in'
            While (rd.Read())
                Session("numrecord") = rd.GetValue(0).ToString()
                rd.GetValue(11).ToString()

                If rd.HasRows Then
                    If rd.GetValue(11).ToString() = 1 Then
                        rd.Read()
                        lblinfo.Text = "You are Authorized."
                        FormsAuthentication.RedirectFromLoginPage(username.Text, True)
                        Response.Redirect("securepages/SecurePage.aspx")
                    Else
                        lblprompt.Text = "Invalid username or password."
                    End If
                    If rd.GetValue(11).ToString() = 2 Then
                        rd.Read()
                        FormsAuthentication.RedirectFromLoginPage(username.Text, True)
                        Response.Redirect("securepages/newShipment.aspx")
                    Else
                        lblprompt.Text = "Invalid username or password."
                    End If
                End If
            End While
        Catch ex As Exception
            lblprompt.Text = "Invalid username or password."
        End Try

ここで何ができていないかについて助けを得ることができますか?

4

2 に答える 2

0

私が見る 1 つの問題は、Try...Catch ブロックで response.redirect'ing を行っていることです。, False URL の後に (中止する代わりにコードの実行を終了できるようにする)を配置しない限り、リダイレクトを試行するたびにThread is abortingエラーがスローされます。

表示されていないメッセージについては、 lblinfoの作成方法を示していますが、lblpromptはどうですか? おそらく、そのvisibleプロパティを false に設定していますか? この場合は、コード内で true に変更してください。また、page_load などのイベントでその値をクリアしていないことを確認してください。

また、コードを少しクリーンアップし、リーダーの代わりにデータテーブル オブジェクトを実装しました。

    Try
        Dim cmd As New SqlCommand("Check_Users", New SqlConnection(GetConnectionString()))
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.Add(New SqlParameter("Login_name", username.Text))
        cmd.Parameters.Add(New SqlParameter("Login_Pwd", password.Text))

        Dim sqlDataAdapter As New SqlClient.SqlDataAdapter(cmd)
        Dim dtResults As New DataTable
        sqlDataAdapter.Fill(dtResults)

        lblprompt.Text = "Invalid username or password."
        'check the Role of the user logging in'
        If dtResults.Rows.Count > 0 Then
            With dtResults.Rows(0)
                Session("numrecord") = .Item(0).ToString()

                If .Item(11).ToString() = 1 Then
                    lblprompt.Text = ""
                    FormsAuthentication.RedirectFromLoginPage(username.Text, True)
                    Response.Redirect("securepages/SecurePage.aspx", False)
                ElseIf .Item(11).ToString() = 2 Then
                    lblprompt.Text = ""
                    FormsAuthentication.RedirectFromLoginPage(username.Text, True)
                    Response.Redirect("securepages/newShipment.aspx", False)
                End If
            End With
        End If
    Catch ex As Exception
        lblprompt.Text = "An error has occurred." & ex.Message
    End Try
于 2013-09-04T20:50:10.720 に答える
0

少なくとも、基本的な POCO オブジェクトを記述して、データ レイヤーからの値をカプセル化してください。

データリーダーを使用して Poco オブジェクトを POPULATE し、Poco オブジェクトにいくつかの基本的なロジックを挿入します。データリーダーをすばやく使用してから、それを取り除きます。

その後、実際にオブジェクトとロジックを再利用できます。

このようなもの。

次に (プレゼンテーション層で) ~リダイレクトなどで Poco の値に応答します。

public enum RedirectTypeEnum
{
    Unknown = 0,
    SecurePage = 1,
    NewShipment = 2,
}

public class LoginAttemptResult
{
    public LoginAttemptResult()
    {
        this.NumRecord = 0;
        this.ResultNumberAkaColumn11 = 0;
    }

    public int NumRecord { get; set; }
    public int ResultNumberAkaColumn11 { get; set; }
    public RedirectTypeEnum RedirectType
    {
        get
        {
            RedirectTypeEnum returnValue = RedirectTypeEnum.Unknown;
            if (this.ResultNumberAkaColumn11 == 1)
            {
                returnValue = RedirectTypeEnum.SecurePage;
            }
            if (this.ResultNumberAkaColumn11 == 2)
            {
                returnValue = RedirectTypeEnum.NewShipment;
            }
            return returnValue;

        }
    }

    public bool IsAuthorized
    {
        get
        {
            if (this.ResultNumberAkaColumn11 == 1)
            {
                return true;
            }
            if (this.ResultNumberAkaColumn11 == 2)
            {
                return false; /* ?? */
            }
            return false;
        }
    }
}

次に、このオブジェクトにデータを入力する場所が 1 つあります。誰かが POCO オブジェクトを見ることで、ビジネス ロジックが何であるかを明確に理解できます。

于 2013-09-04T20:21:23.333 に答える