在系统登陆界面中Response.Redirect()函数出现奇怪的现象。开始时,系统未连接数据库,本人用XML形式测试代码,如下:
XmlDocument doc = new XmlDocument();
doc.Load(HttpContext.Current.Server.MapPath("") + @"\database.xml");
XmlElement root = doc.DocumentElement;
foreach (XmlNode node in root.ChildNodes)
{
   if (Login1.UserName == node.Attributes["name"].Value && Login1.Password == node.Attributes["pwd"].Value)
   {
      Session["userName"] = Login1.UserName;
      Session["authority"] = node.Attributes["authority"].Value;
      Response.Redirect(Login1.DestinationPageUrl, true);  //验证成功,xml测试时成功跳转
   }
}
Response.Redirect("Default.aspx");  //身份验证未通过,跳转到原页面其中的database.xml中包含了登陆用户,Login1.DestinationPageUrl属性包含了身份验证通过后的主页面Main.aspx。
Response.Redirect(Login1.DestinationPageUrl, true);
如果对Response.Redirect()进行try...catch...出现ThreadAbortException异常,这是正常线程结束异常,无关紧要。后来,系统连接到数据库后的代码如下:
string userID = Login1.UserName.Trim();
string password = Login1.Password.Trim();
string strSelect = "select OperatorID,OperatorPass,OperatorName,OperatorType,FieldCode from pb_Operator where OperatorID='" + userID + "' and OperatorPass='" + password + "'";  //数据库查询字符串
SqlDataReader reader = dbManager.GetDataReader(strSelect);
if (reader.Read())  //数据库查询通过
{
   //保存到Session
   Session["OperatorID"] = reader["OperatorID"]; //帐号
   Session["OperatorName"] = reader["OperatorName"];   //姓名
   Session["OperatorType"] = reader["OperatorType"];   //操作员类型
   Session["FieldCode"] = reader["FieldCode"];  //所属域编号
   Response.Redirect(Login1.DestinationPageUrl, true);  //系统也成功运行到这里,但是却跳转到原页面Default.aspx,而不是指定的Main.aspx页面。这是为什么?
}
Response.Redirect("Default.aspx");数据库连接成功,并且也成功读取了用户数据并保存到Session变量中。但是到了Response.Redirect(Login1.DestinationPageUrl, true);后却不进行页面跳转(页面也进行了跳转,但是却跳转到Default.aspx,而不是指定的Main.aspx),还是在原来的Default.aspx登陆页面。进行try...catch...出现同样的ThreadAbortException异常。如此这般,就是改变Login1.DestinationPageUrl的跳转页面值,也还是回到原来的Default.aspx页面,甚至在跳转页面值指向其他文件夹中的页面如xxx\xxx.aspx,系统会跳出xxx\Default.aspx页面不存在的错误。
也就是说,好像系统绑定了Default.aspx似的。因此,我在清空了系统Frame文件夹下的临时文件。原以为总不会出现了,但是还是出现一直Default.aspx的现象。我都快被逼疯了,高手来救救我吧。

解决方案 »

  1.   

    设置断点一步步跟踪,察看到底错误在什么地方
    可能根本就没有执行到Response.Redirect
      

  2.   

    你干脆把程序写得明白一点吧:if (reader.Read())  //数据库查询通过
    {
       //保存到Session
       Session["OperatorID"] = reader["OperatorID"]; //帐号
       Session["OperatorName"] = reader["OperatorName"];   //姓名
       Session["OperatorType"] = reader["OperatorType"];   //操作员类型
       Session["FieldCode"] = reader["FieldCode"];  //所属域编号
       Response.Redirect(Login1.DestinationPageUrl, true);  //系统也成功运行到这里,但是却跳转到原页面Default.aspx,而不是指定的Main.aspx页面。这是为什么?
    }
    else
      Response.Redirect("Default.aspx");
    我不喜欢写程序的逻辑故意不明白、靠“隐喻”让读者去揣摩,绝对不能说明程序员更懂技术。应该写出大实话般的程序。
      

  3.   

    if (reader.Read())  //数据库查询通过
    {
       //保存到Session
       Session["OperatorID"] = reader["OperatorID"]; //帐号
       Session["OperatorName"] = reader["OperatorName"];   //姓名
       Session["OperatorType"] = reader["OperatorType"];   //操作员类型
       Session["FieldCode"] = reader["FieldCode"];  //所属域编号
       Response.Redirect(Login1.DestinationPageUrl, true);  //系统也成功运行到这里,但是却跳转到原页面Default.aspx,而不是指定的Main.aspx页面。这是为什么?
    }
    else
    {
    Response.Redirect("Default.aspx");
    }
      
    *****************************************************************************
    欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) 最新版本:20070212http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html
      

  4.   

    这个是这样的 要解决很简单啊
    if (reader.Read())  //数据库查询通过
    {
       //保存到Session
       Session["OperatorID"] = reader["OperatorID"]; //帐号
       Session["OperatorName"] = reader["OperatorName"];   //姓名
       Session["OperatorType"] = reader["OperatorType"];   //操作员类型
       Session["FieldCode"] = reader["FieldCode"];  //所属域编号
       Response.Redirect(Login1.DestinationPageUrl, true);  //系统也成功运行到这里,但是却跳转到原页面Default.aspx,而不是指定的Main.aspx页面。这是为什么?
    }
    else
    {
       Response.Redirect("Default.aspx");
    }
      

  5.   

    写else,或者在第一个Redirect后边写上return。尽管你会说这个return永远执行不到,但是此时不关心是否执行不到,而是关心代码的形式(而不是靠异常控制方面)上不易读逻辑。
      

  6.   

    在webconfig配置文件里面 有个参数要指定 就是指定异常捕获跳转处理项 具体是哪个忘了 你自己在里面去找下 系统默认就是Default.aspx
      

  7.   

    你加断点看看读取XML节点的时候是否有错误
      

  8.   

    to huo789(四火) :断点肯定设置了,并且对各参数进行了跟踪调试,但是没有任何错误。就是Response.Redirect()那里也没有错误,不包括catch的TheadAbortException异常。只是想不明白的是为什么没有成功跳转?to sp1234(准备吃蛤蚧):先我的问题解决,再来跟你讨论规范问题。to feiyun0112(http://feiyun0112.cnblogs.com/):这个问题不可能只是加个else就能解决了的!to coolbyefish():在Web.Config中有如下代码可能涉及到默认跳转,但是为什么在xml中能成功跳转,而在数据库中却不能呢?都是在同一个web.config!
    <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
                <error statusCode="403" redirect="NoAccess.htm" />
                <error statusCode="404" redirect="FileNotFound.htm" />
            </customErrors>
      

  9.   

    跟踪下看:Login1.DestinationPageUrl里有值么?
    是不是因为什么条件跳转了?
      

  10.   

    reader.Read()  可以通过么?
      

  11.   

    to hanguoji84(北飘):
    Login1.DestinationPageUrl的值就是目标页面,正确。程序是发生了跳转,但是却跳转到原Default.aspx页面上,而不是目标页面。
    reader.Read(),根据其中是否有值来判断用户身份验证是否通过。
    这些都是没问题的,问题就是程序到达了Response.Redirect()函数,为什么没有跳转到Login1.DestinationPageUrl指定的页面?
    更让人想不通的是,在xml测试时没问题,在数据库测试却出现这种问题。把这两份代码反复注释掉其中一份,还是出现xml测试没问题,数据库测试有问题。天呐,这不是耍我吗?
      

  12.   

    我跟你说嘛
    .net有时候就是会出点稀奇的问题,如果你觉得实在是逻辑正确的话!那么给你点经验
    解决方法:项目重新编译  若不行
    则重起计算机 重新编译
      

  13.   

    真是对不起大家了。以上现象都是由于我自己粗心,单词拼写错误造成的。由于在跳转的页面上需要验证Session来检查用户登陆是否成功。而因为拼写错了一个单词而使这个条件一直为false,而使页面一直回跳。唉,不能小看这小小的错误啊,不然麻烦是很大的。现在揭帖