1

次回からログイン コントロールに保存するための Cookie を保存するコードを作成しています。ユーザーが「Remember Me」チェックボックスをオンにした場合、これはユーザーのユーザー名をテキストボックスに保存します。そして、私のログイン コントロールは 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の子である に含まれていますLoginView1Login1したがって、 ではなく内で検索する必要がありますLoginView1

于 2012-07-08T18:27:13.273 に答える
0

問題がチェックボックスの参照に起因する場合は、これを試してください。.NET Framework 4を使用している場合はClientIDMode、チェックボックスのプロパティを次のように静的に設定します。ClientIDMode="Static"

于 2012-07-08T17:24:48.390 に答える
0
CheckBox RememberMe =  LoginView1.FindControl("RememberMe") as CheckBox;

「RememberMe」ID を使用してチェックボックスを見つけようとしています。ただし、このチェックボックスの ID が Web ページとまったく同じであることを確認してください。ASP.NET はデフォルトで「クリーンな」ID を生成しません - ctl00$RemeberMe のようになります

于 2012-07-08T17:15:50.727 に答える