我正在编写代码,以便下次在Login控件中为Remember Me存储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;
}
}
答案 0 :(得分: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
内搜索,而不是{{1}}。
答案 1 :(得分:0)
CheckBox RememberMe = LoginView1.FindControl("RememberMe") as CheckBox;
您正在尝试使用“RememberMe”ID找到您的复选框。但请检查此复选框在您的网页上是否具有完全相同的ID。 ASP.NET默认情况下不生成“干净”的ID - 它看起来像ctl00 $ RemeberMe
答案 2 :(得分:0)
如果问题是由复选框引用引起的,请尝试此操作。如果您使用的是.NET Framework 4,则将复选框的ClientIDMode
属性设置为静态,如下所示。 ClientIDMode="Static"