Reputation: 127
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;
}
}
Upvotes: 1
Views: 4460
Reputation: 533
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
Upvotes: 0
Reputation: 6123
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"
Upvotes: 0
Reputation: 2392
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
.
Upvotes: 1