none
asp.net C#中页面跳转的问题 RRS feed

  • 问题

  • 在今天的开发系统调试的过程中,代码没有运行错误,可就是实现不了页面的跳转,请各位高手帮我看看原因出在哪里(想了好久都没想明白),拜托了,代码如下:

    using System;
    using System.Collections;
    using System.Configuration;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    using System.Data.SqlClient;

    public partial class Login : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        protected void btnLogin_Click(object sender, EventArgs e)
        {
            //接收用户输入的参数
            string userId = txtUserId.Text.ToString().Trim();
            string userPwd = txtPwd.Text.ToString().Trim();
            string userRole = rblClass.SelectedValue.Trim();
            string selectStr = "";
            switch (userRole)
            {
                case "0":       //身份为学生时
                    selectStr = "select * from StudentTable where StudentID='" + userId + "'";
                    break;
                case "1":       //身份为管理员时
                    selectStr = "select * from AdminTable where AdminID='" + userId + "'";
                    break;
            }
            SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
            SqlCommand cmd = new SqlCommand(selectStr, conn);
            try
            {
                conn.Open();   //打开连接
                SqlDataReader sdr = cmd.ExecuteReader();    //执行查询
                if (sdr.Read())                             //如果该用户存在
                {
                    if (sdr.GetString(0) == userPwd)           //密码正确
                    {
                        Session["UserRole"] = userRole;
                        conn.Close();
                        switch (userRole)
                        {
                            case "0":                        //身份为学生时
                                Session["StudentID"] = userId;
                                Session["AdminID"] = "";
                                Response.Redirect("WelcomeStudent.aspx");
                                break;
                            case "1":                        //身份为管理员时
                                Session["AdminID"] = userId;
                                Session["StudentID"] = "";
                                Response.Redirect("WelcomeAdmin.aspx");
                                break;
                        }
                    }
                    else                                      //密码错误,给出提示信息
                    {
                        lblMessage.Text = "该学号不存在或学号输入错误,请检查后重新输入!";
                    }
                }
            }
            catch (Exception ee)
            {
                Response.Write("<script language=javascript>alert('" + ee.Message.ToString() + "')</script>");
            }
            finally
            {
                conn.Close();
            }

        }

    protected void  btnClose_Close(object sender, EventArgs e)
    {
        Response.Write("<script language:javascript>javascript:window.close();</script>");

    }

    protected void btnReset_Reset(object sender, EventArgs e)
    {
        this.txtUserId.Text = "";
        this.txtPwd.Text = "";
    }
    }
    补充:我的数据库连接字符串的配置信息为:
    <connectionStrings>
      <add name="ConnectionString" connectionString="Data Source=.;Initial Catalog=Student;Integrated Security=True" providerName="System.Data.SqlClient"/>
     </connectionStrings>
    不知道错在哪,数据的连接应该没有问题,想了好久都没想明白,希望高手们能帮忙看一下,在下感激不尽!

    2010年1月23日 16:26

答案

  • 按你的逻辑出问题的原因就是当用户是学生身份时,密码不正确。

    大概可能是下面的原因:

    1 你输入的密码真的不正确。
    2 sdr.GetString(0) 读取的内容并不是密码,将 dr.GetString(0) 打印出来看看是不是你期望的值。
    3 你上述代码中并未出现密码的加密与解密,如果密码使用了加密应该考虑这点。

    你执行单步调试上述问题都很容易发现。


    知识改变命运,奋斗成就人生!
    • 已标记为答案 Smiling008 2010年1月24日 6:54
    2010年1月24日 3:01
    版主

全部回复

  • 你好!

    打个断点
    检查 userRole 是否为 0 或 1 
    检查 DataReader 是否读取了至少一条数据。

    另外与数据交互建议使用参数方式代替字符串拼接

    知识改变命运,奋斗成就人生!
    2010年1月24日 1:27
    版主
  • 您好,我按照您的提示设置了断点检查发现执行到这条语句Session["UserRole"] = userRole;之后就不能在正确的执行,总是出现"该学号不存在或学号输入错误,请检查后重新输入!";这样的情况,但是只要是以管理员的身份进入系统,就很顺利;而以学生的身份进入总是出现上述问题!

    2010年1月24日 2:30
  • 按你的逻辑出问题的原因就是当用户是学生身份时,密码不正确。

    大概可能是下面的原因:

    1 你输入的密码真的不正确。
    2 sdr.GetString(0) 读取的内容并不是密码,将 dr.GetString(0) 打印出来看看是不是你期望的值。
    3 你上述代码中并未出现密码的加密与解密,如果密码使用了加密应该考虑这点。

    你执行单步调试上述问题都很容易发现。


    知识改变命运,奋斗成就人生!
    • 已标记为答案 Smiling008 2010年1月24日 6:54
    2010年1月24日 3:01
    版主
  • 版主,您好,我刚刚按照你的方法,调试了原因,发现在局部变量一栏中,显示的userPwd的密码与我数据库设置的密码是一致的啊,不过它会偶尔出现ExecuteReader:CommandText属性尚未初始化的提示

    2010年1月24日 3:15
  • CommandText 属性尚未初始化的提示原原因是 userRole 不是 0 和 1 时 selectStr  会为空造成的。这是你的代码控制不严谨造成的,比如 rblClass.SelectedValue 为空时。

    switch (userRole)
    {
        case "0":       //身份为学生时
            selectStr = "select * from StudentTable where StudentID='" + userId + "'";
            break;
        case "1":       //身份为管理员时
            selectStr = "select * from AdminTable where AdminID='" + userId + "'";
            break;
        default:
            throw new Exception("逻辑错误!不正确的 userRole");
    }

    出错时 sdr.GetString(0) == userPwd 肯定是不等的。你分别将两个值打印出来,看看字符前后是否有空格这样的不容易发现的字符。

    知识改变命运,奋斗成就人生!
    2010年1月24日 3:27
    版主
  • X.X.Y 版主,“老师”请允许我这么称呼您,谢谢您帮我这么多,不过我已经找出了问题的所在,是我的自己的数据库对应列设计方面出了问题,导致sdr.GetString(0) == userPwd无法读出正确的密码。
    2010年1月24日 6:02
  • 你好!

    解决了就好,其实这个问题在在我第二个回帖的第2点中也详细说明了,可能是你没有留意。另外读取 Reader 指定字段的内容除了用索引方式还可以使用 reader["字段名"],这里你可以这样改 sdr["密码字符名"].ToString() == userPwd

    知识改变命运,奋斗成就人生!
    2010年1月24日 6:09
    版主
  • 恩,好的,下次我试试!谢谢啦!

    2010年1月24日 6:51