1

我正在编写代码来存储下次登录控件中记住我的 cookie。如果用户选中了“记住我”复选框,这会将用户的用户名存储在文本框中。我的登录控件是在 LoginView 中设置的。

当我运行程序并填写登录控件中的字段并点击提交(有或没有选中复选框)时,它给了我这个错误:

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 

Line 65: 
Line 66:         HttpCookie myCookie = new HttpCookie("myCookie");
Line 67:         if (RememberMe.Checked == true) //here is the line giving error
Line 68:         {
Line 69:             myCookie.Values.Add("username", Login1.UserName);

Line: 67 

这是登录控制的代码:

 <asp:LoginView ID="LoginView1" runat="server">
        <AnonymousTemplate> 
        <asp:Login ID="Login1" runat="server" onloggingin="Login1_LoggingIn" 
                onloginerror="Login1_LoginError" onauthenticate="Login1_Authenticate" 
                RememberMeSet="True">
            <LayoutTemplate>
                <table cellpadding="1" cellspacing="0" style="border-collapse:collapse;">
                    <tr>
                        <td>
                            <table cellpadding="0">
                                <tr>
                                    <td align="center" colspan="2">
                                        Log In</td>
                                </tr>
                                <tr>
                                    <td align="right">
                                        <asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserName">User Name:</asp:Label>
                                    </td>
                                    <td>
                                        <asp:TextBox ID="UserName" runat="server"></asp:TextBox>
                                        <asp:RequiredFieldValidator ID="UserNameRequired" runat="server" 
                                            ControlToValidate="UserName" ErrorMessage="User Name is required." 
                                            ToolTip="User Name is required." ValidationGroup="ctl00$Login1">*</asp:RequiredFieldValidator>
                                    </td>
                                </tr>
                                <tr>
                                    <td align="right">
                                        <asp:Label ID="PasswordLabel" runat="server" AssociatedControlID="Password">Password:</asp:Label>
                                    </td>
                                    <td>
                                        <asp:TextBox ID="Password" runat="server" TextMode="Password"></asp:TextBox>
                                        <asp:RequiredFieldValidator ID="PasswordRequired" runat="server" 
                                            ControlToValidate="Password" ErrorMessage="Password is required." 
                                            ToolTip="Password is required." ValidationGroup="ctl00$Login1">*</asp:RequiredFieldValidator>
                                    </td>
                                </tr>
                                <tr>
                                    <td colspan="2">
                                        <asp:CheckBox ID="RememberMe" runat="server" 
                                            Text="Remember me next time." />
                                    </td>
                                </tr>
                                <tr>
                                    <td align="center" colspan="2" style="color:Red;">
                                        <asp:Literal ID="FailureText" runat="server" EnableViewState="False"></asp:Literal>
                                    </td>
                                </tr>
                                <tr>
                                    <td align="right" colspan="2">
                                        <asp:Button ID="LoginButton" runat="server" CommandName="Login" Text="Log In" 
                                            ValidationGroup="ctl00$Login1" />
                                    </td>
                                </tr>
                            </table>
                        </td>
                    </tr>
                </table>
            </LayoutTemplate>
        </asp:Login>
      </AnonymousTemplate>

      <LoggedInTemplate> 
          <asp:LoginStatus ID="LoginStatus1" runat="server" />

      </LoggedInTemplate>
        </asp:LoginView>

这是后面的代码:

protected void Page_Load(object sender, EventArgs e)
{
    System.Web.UI.WebControls.Login Login1 = (System.Web.UI.WebControls.Login)LoginView1.FindControl("Login1");
    TextBox UserName = (TextBox)Login1.FindControl("UserName");


    if (Request.Cookies["myCookie"] != null)
    {

        HttpCookie cookie = Request.Cookies.Get("myCookie");
        Login1.UserName = cookie.Values["username"];

        //.Attributes.Add("value", cookie.Values["password"]);
        Response.Cookies["myCookie"].Expires = DateTime.Now.AddDays(-1);


    }
} 

protected void Login1_LoggingIn(object sender, LoginCancelEventArgs e)
{
     System.Web.UI.WebControls.Login Login1 = (System.Web.UI.WebControls.Login)LoginView1.FindControl("Login1");
    TextBox UserName = (TextBox)Login1.FindControl("UserName");

    //Check to see if the current user exists
    if (Membership.GetUser(Login1.UserName) != null)
    {
        //Check to see if the user is currently locked out
        if (Membership.GetUser(Login1.UserName).IsLockedOut)
        {
            //Get the last lockout  date from the user
            DateTime lastLockout = Membership.GetUser(Login1.UserName).LastLockoutDate;
            Response.Write(lastLockout.ToString()); 
            //Calculate the time the user should be unlocked
            DateTime unlockDate = lastLockout.AddMinutes(Membership.PasswordAttemptWindow);

            //Check to see if it is time to unlock the user
            if (DateTime.Now > unlockDate)
                Membership.GetUser(Login1.UserName).UnlockUser();
        }
    }


}


protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
    System.Web.UI.WebControls.Login Login1 = (System.Web.UI.WebControls.Login)LoginView1.FindControl("Login1");
    TextBox UserName = (TextBox)Login1.FindControl("UserName");

    Response.Cookies.Add(new HttpCookie("UserName", Login1.UserName));
    CheckBox RememberMe =  LoginView1.FindControl("RememberMe") as CheckBox;
    //CheckBox RememberMe = (CheckBox).Login1.FindControl("RememberMe"); 

    HttpCookie myCookie = new HttpCookie("myCookie");
    if (RememberMe.Checked == true)
    {
        myCookie.Values.Add("username", Login1.UserName);
        myCookie.Expires = DateTime.Now.AddDays(15);
        Response.Cookies.Add(myCookie);
    }

}


protected void Login1_LoginError(object sender, EventArgs e)
{
    System.Web.UI.WebControls.Login Login1 = (System.Web.UI.WebControls.Login)LoginView1.FindControl("Login1");
    TextBox UserName = (TextBox)Login1.FindControl("UserName");
    Literal FailureText = (Literal)Login1.FindControl("FailureText");


    //There was a problem logging in the user
    //See if this user exists in the database

    MembershipUser userInfo = Membership.GetUser(Login1.UserName);

    if (userInfo == null)
    {
        //The user entered an invalid username...

        Login1.FailureText = "There is no user in the database with the username " + UserName.Text;
    }
    else
    {
        //See if the user is locked out or not approved
        if (!userInfo.IsApproved)

            Login1.FailureText = "When you created your account you were sent an email with steps to verify your account. You must follow these steps before you can log into the site.";

        else if (userInfo.IsLockedOut)

            Login1.FailureText = "Your account has been temporary locked due to a maximum number of incorrect login attempts.";

        else

            //The password was incorrect (don't show anything, the Login control already describes the problem)
            Login1.FailureText = string.Empty;

    }
}
4

3 回答 3

1

在您的代码隐藏文件中,尝试将 Login1_Authenticate 方法替换为以下代码:

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
    System.Web.UI.WebControls.Login Login1 = (System.Web.UI.WebControls.Login)LoginView1.FindControl("Login1");
    TextBox UserName = (TextBox)Login1.FindControl("UserName");

    Response.Cookies.Add(new HttpCookie("UserName", Login1.UserName));

    // IMPORTANT: Notice that LoginView1 is changed to Login1
    CheckBox RememberMe =  Login1.FindControl("RememberMe") as CheckBox; 

    HttpCookie myCookie = new HttpCookie("myCookie");
    if (RememberMe.Checked == true)
    {
        myCookie.Values.Add("username", Login1.UserName);
        myCookie.Expires = DateTime.Now.AddDays(15);
        Response.Cookies.Add(myCookie);
    }

}

我认为您遇到的问题与该方法不分层搜索的事实有关FindControl- 也就是说,它只会找到直接包含在父级中的子控件。它不会搜索图层。

在您的情况下,复选框包含在 中Login1,而后者又是 的子级LoginView1。所以你需要在里面搜索Login1,而不是LoginView1

于 2012-07-08T18:27:13.273 回答
0
CheckBox RememberMe =  LoginView1.FindControl("RememberMe") as CheckBox;

您正在尝试使用“RememberMe”ID 找到您的复选框。但请检查此复选框在您的网页上是否具有完全相同的 ID。默认情况下,ASP.NET 不会生成“干净”ID - 它看起来像 ctl00$RemeberMe

于 2012-07-08T17:15:50.727 回答
0

如果问题是由于复选框引用引起的,那么试试这个。如果您使用的是 .NET Framework 4 ClientIDMode,则将复选框的属性设置为静态,如下所示。ClientIDMode="Static"

于 2012-07-08T17:24:48.390 回答