Question

I am writing code to store cookies for Remember Me next time in Login control. Which this will store the user's username on the textbox if the user had checked the "Remember Me" check box. And my login control was set inside LoginView.

When i run the program and fill in the fields in the login control and hit submit(with or without checking the check box), it gave me this error:

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 

This is the code for login control:

 <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>

This is the code at the back:

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;

    }
}
Was it helpful?

Solution

In your code-behind file, try replacing the Login1_Authenticate method with the following code:

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);
    }

}

I think the problem you are having is related to the fact that the FindControl method doesn't search hierarchically - that is, it only will find a child control that is directly contained within the parent. It doesn't search through the layers.

In your case, the check box is contained within Login1, which in turn is a child of LoginView1. So you need to search within Login1, and not LoginView1.

OTHER TIPS

If the problem is due to the checkbox reference then try this. If you are using the .NET Framework 4 then set the ClientIDMode property of the checkbox to static like this. ClientIDMode="Static"

CheckBox RememberMe =  LoginView1.FindControl("RememberMe") as CheckBox;

You are trying to find your checkbox using "RememberMe" ID. But check that this checkbox has exactly the same ID on your web page. ASP.NET doesnt generate a "clean" ID by default - it will look like ctl00$RemeberMe

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top