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

至少,请编写一个基本的 POCO 对象来封装来自数据层的值。

使用您的数据阅读器填充 Poco 对象,并在 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;
        }
    }
}

然后,您将在一个地方填充此对象,并且有人可以通过查看 POCO 对象清楚地看到业务逻辑是什么。

于 2013-09-04T20:21:23.333 回答
0

我看到的一个问题是您在 Try...Catch 块中进行响应重定向。除非您, 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 回答