【问题标题】:asp.net spooky page loadasp.net 诡异的页面加载
【发布时间】:2009-08-17 13:13:18
【问题描述】:

除此之外,我的网站项目中有两个页面。 Default.aspx 和 TeacherControlPanel.aspx。

用户在 Default.aspx 中提供他的凭据,创建一个 cookie 然后他被 Server.Transfer()ed 到 TeacherControlPanel.aspx。

TeacherControlPanel.aspx 有一个注销按钮和另一个名为“发送邮件”的按钮。

如果用户按下注销按钮,cookie 将被删除并被重定向到 Default.aspx。

如果用户在没有注销的情况下关闭浏览器,当他打开 Default.aspx 页面时,他会自动重定向到 TeacherControlPanel.aspx,因为 cookie 就在那里。

现在,一切正常,除了我在 TeacherControlPanel.aspx 上按下“发送邮件”按钮,然后加载 Default.aspx,然后加载 TeacherControlPanel.aspx,但未执行 Button 事件处理程序。

为什么 Default.aspx 再次加载,Button 事件发生了什么?

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">

    <table>
        <tr>
        <td><asp:HyperLink ID="homePageHyperlink" runat="server" NavigateUrl="~/Default.aspx">Home</asp:HyperLink></td>        
        <td rowspan="5">&nbsp;<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
        </asp:contentplaceholder></td>
        </tr>
        <tr>
        <td><asp:HyperLink ID="studentControlPanelHyperlink" runat="server">Student</asp:HyperLink></td>        
        </tr>
        <tr>
        <td></td>        
        </tr>
        <tr>
        <td></td>  
        </tr>
        <tr>
        <td></td>   
        </tr>
    </table>    
    </form>
</body>
</html>


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

public partial class MasterPage : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string st = "";
    }
}


<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <table style="width: 253px; height: 118px">
        <tr>
            <td style="width: 54px">
            </td>
            <td colspan="2">
            </td>
        </tr>
        <tr>
            <td align="right" style="width: 54px">
                <asp:Label ID="Label1" runat="server" Text="Username :"></asp:Label></td>
            <td colspan="2">
                <asp:TextBox ID="usernameTextBox" runat="server"></asp:TextBox></td>
        </tr>
        <tr>
            <td style="width: 54px">
                <asp:Label ID="Label2" runat="server" Text="Passord  :"></asp:Label></td>
            <td colspan="2">
                <asp:TextBox ID="passwordTextBox" runat="server"></asp:TextBox></td>
        </tr>
        <tr>
            <td style="width: 54px">
            </td>
            <td colspan="2">
                <asp:Button ID="btnLogin" runat="server" OnClick="btnLogin_Click" Text="Login" /></td>
        </tr>
        <tr>
            <td colspan="3">
                <asp:Label ID="labLoginMessage" runat="server" Font-Bold="True" Font-Names="Verdana"
                    Font-Size="Small" ForeColor="#C00000" Text="Label" Width="226px"></asp:Label></td>
        </tr>
    </table>
</asp:Content>

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

using Ice_Web_Portal.BO;
using Ice_Web_Portal.ASP.NET.Utils;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        AspNetUtil util = new AspNetUtil(this);

        util.DisposeCookie("user");

        UserTypeEnum userType = EnumUtility.ConvertToEnum(util.GetCookieValue("user", "usertype"));
        string username = util.GetCookieValue("user", "username");

        if (userType == UserTypeEnum.Student)
        {
            Server.Transfer("~/Student/StudentControlPanel.aspx?username=" + username);
        }
        else if (userType == UserTypeEnum.Teacher)
        {
            Server.Transfer("~/Teacher/TeacherControlPanel.aspx?username=" + username);
        }
    }

    protected void btnLogin_Click(object sender, EventArgs e)
    {
        string username = this.usernameTextBox.Text;
        string password = this.passwordTextBox.Text;

        bool success = Ice_Web_Portal.BO.User.LogIn(username, password);

        if (success)
        {
            Ice_Web_Portal.BO.User user = Ice_Web_Portal.BO.User.GetUserByUserName(username);

            Ice_Web_Portal.BO.UserTypeEnum loginUserType = user.UserTypeEnum;

            if (loginUserType == UserTypeEnum.Student)
            {
                AspNetUtil util = new AspNetUtil(this);
                util.SaveInCookie("user", "username", username, 3600);
                util.SaveInCookie("user", "usertype", "Student", 3600);

                Server.Transfer("~/Student/StudentControlPanel.aspx?username=" + username);
            }
            else if (loginUserType == UserTypeEnum.Teacher)
            {
                AspNetUtil util = new AspNetUtil(this);
                util.SaveInCookie("user", "username", username, 3600);
                util.SaveInCookie("user", "usertype", "Teacher", 3600);

                Server.Transfer("~/Teacher/TeacherControlPanel.aspx?username=" + username);                
            }
            else
            {
                labLoginMessage.Text = "Sorry! Type of user couldn't be determined!";
            }
        }
        else
        {
            labLoginMessage.Text = Ice_Web_Portal.BO.User.LoginMessage;
        }
    }
}

<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="TeacherControlPanel.aspx.cs" Inherits="Teacher_TeacherControlPanel" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <table style="width: 346px">
        <tr>
            <td>
                <asp:Label ID="labErrorMessage" runat="server" Font-Bold="True" Font-Names="Verdana"
                    Font-Size="Small" ForeColor="#C00000" Text="Error Message"></asp:Label></td>
            <td>
                </td>
            <td>
                </td>
            <td>
                </td>
        </tr>
        <tr>
            <td>
                Teacher Control Panel</td>
            <td>
                Mails</td>
            <td>
                Notices</td>
            <td>
                Uploads</td>
        </tr>
        <tr>
            <td rowspan="3">
                <table style="width: 134px">
                    <tr>
                        <td>
                            Username:</td>
                        <td>
                            <asp:Label ID="labUsername" runat="server" Text="labUsername"></asp:Label></td>
                        <td>
                            Teacher Code:
                        </td>
                        <td style="width: 3px">
                            <asp:Label ID="labTeacherCode" runat="server" Text="labTeacherCode"></asp:Label></td>

                    </tr>
                    <tr>
                        <td>
                            Name :</td>
                        <td>
                            <asp:Label ID="labName" runat="server" Text="labName"></asp:Label></td>
                        <td>
                            Department</td>
                        <td style="width: 3px">
                            <asp:Label ID="labDepartment" runat="server" Text="labDepartment"></asp:Label></td>
                    </tr>
                    <tr>
                        <td>
                        </td>
                        <td>
                        </td>
                        <td>
                        </td>
                        <td style="width: 3px">
                        </td>
                    </tr>
                    <tr>
                        <td>
                        </td>
                        <td>
                        </td>
                        <td>
                        </td>
                        <td style="width: 3px">
                        </td>
                    </tr>
                </table>
            </td>
            <td>
                <asp:Button ID="btnSendMail" runat="server" Height="24px" Text="Send Mail" Width="130px" OnClick="btnSendMail_Click" PostBackUrl="~/Teacher/TeacherControlPanel.aspx" /></td>
            <td>
                <asp:Button ID="btnSubmitNewNotice" runat="server" Height="24px" Text="Submit New Notice"
                    Width="130px" /></td>
            <td>
                <asp:Button ID="btnViewUploads" runat="server" Height="24px" Text="ViewUploads" Width="130px" /></td>
        </tr>
        <tr>
            <td>
                <asp:Button ID="btnViewOldMails" runat="server" Text="View Old Mails" OnClick="btnViewOldMails_Click" /></td>
            <td>
                <asp:Button ID="btnViewOldNotices" runat="server" Height="24px" Text="View Old Notices"
                    Width="130px" /></td>
            <td>
                <asp:Button ID="btnViewDefaulters" runat="server" Height="24px" Text="View Defaulters"
                    Width="130px" /></td>
        </tr>
        <tr>
            <td>
                <asp:Button ID="btnReceivedMails" runat="server" Height="24px" Text="Received Mails"
                    Width="130px" /></td>
            <td>
            </td>
            <td>
            </td>
        </tr>
        <tr>
            <td colspan="4" rowspan="1">
                <asp:GridView ID="UploadsGridView1" runat="server">
                </asp:GridView>
            </td>
        </tr>
    </table>
</asp:Content>

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

using Ice_Web_Portal.ASP.NET.Utils;
using Ice_Web_Portal.BO;

public partial class Teacher_TeacherControlPanel : System.Web.UI.Page
{
    string username = string.Empty;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            username = (string)Request.QueryString["username"];

            Teacher teacher = Teacher.GetTeacherByUsername(username);

            if (teacher != null)
            {
                labUsername.Text = username;
                labName.Text = teacher.TeacherName;
                labTeacherCode.Text = teacher.TeacherCode;

                Dept dept = teacher.Department;

                if (dept != null)
                {
                    labDepartment.Text = dept.DeptName;
                }
            }
            else
            {
                labErrorMessage.Text = "No teacher found";
            }
        }
    }

    protected void btnSendMail_Click(object sender, EventArgs e)
    {
        //try
        {
            Server.Transfer(@"~/Teacher/TeacherSendMail.aspx?username=" + username);
            //Response.Redirect(@"~/Student/StudentSendMail.aspx?username=" + username);
        }
        //catch (Exception ex)
        {
            string m;
        }
    }

    protected void btnViewOldMails_Click(object sender, EventArgs e)
    {
        //try
        {
            Server.Transfer(@"~/Teacher/TeacherOldMail.aspx?username=" + username);
            //Response.Redirect(@"~/Student/StudentSendMail.aspx?username=" + username);
        }
        //catch (Exception ex)
        {
            string m;
        }
    }
}

【问题讨论】:

  • 你能发布代码吗?这样调试起来会容易得多。

标签: asp.net events


【解决方案1】:

当您使用 Response.Redirect 而不是 Server.Transfer 时,是否也会发生这种情况? Server.Transfer 之后,您在浏览器地址栏中看到的 URL 是什么?

【讨论】:

  • 所以当你提交表单时它被提交到错误的页面,你的浏览器仍然认为你在 default.aspx 上,因为传输发生在服务器上,而不是在客户端上。 Bet Response.Redirect 解决了您的问题?
  • 那么什么时候使用Server.Transfer()呢?它有什么用处?
  • 哈哈。对不起,我不应该因为你的学习而笑,但这真的很有趣。 localhost 仅在您的机器上运行。这就是“本地”位的含义。这意味着您提供给我们的链接不会被世界上任何其他人看到,即使它对您来说效果很好。考虑到您的学习者状态,您不太可能拥有自己的服务器来托管该站点,因此请提供这些有用的章节和源代码。谢谢。
  • 我很抱歉,但我确实向那个人询问了 url,看看他是否还有 default.aspx,不是因为我想点击他的页面来查看它:)
【解决方案2】:

您的表单/按钮事件在做什么?听起来您在 PostBack 上执行了代码,但没有看到代码很难说。

【讨论】:

    【解决方案3】:

    如果您通过默认登录但不关闭浏览器,“发送邮件”是否正常工作?我的假设是 Server.Transfer 是问题所在。默认是接收事件,然后将控制权转移到 TeacherControlPanel 但不传递事件。

    所以,就像 Henk 所说,尝试重定向。

    【讨论】:

    • 但这昨天还在工作。当我在项目中添加新页面时出现问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2014-03-17
    • 2011-12-02
    相关资源
    最近更新 更多