我正在编写代码来存储下次登录控件中记住我的 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;
}
}