ASP IF逻辑功能不完全正常

时间:2013-09-04 19:26:45

标签: asp.net vb.net

我有一个用于检查角色的登录表单,当符合凭据时,用户将被定向到特定页面。我的问题是,当用户名或密码不正确时,我的逻辑无法通过我在设计中的标签提示用户。我甚至尝试通过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

我可以得到一些关于未能在这里做什么的帮助吗?

2 个答案:

答案 0 :(得分:0)

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

使用您的datareader来播放Poco对象,并在Poco对象上插入一些基本逻辑。 快速使用datareader,然后摆脱它。

然后你可以重用对象和你的逻辑。

像这样。

然后(在表示层中)〜用重定向等响应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对象清楚地看到商业逻辑是什么。

答案 1 :(得分:0)

我看到的一个问题是你在Try ... Catch块中的response.redirect'。除非您在URL之后放置, False (允许代码完成执行而不是中止),否则每次尝试重定向时都会抛出 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