程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> Login控件在UpdatePanel內當驗證用戶信息成功後出現頁面刷新的解決辦法

Login控件在UpdatePanel內當驗證用戶信息成功後出現頁面刷新的解決辦法

編輯:.NET實例教程
 隨著AJAX.NET BETA 2在今天發布,讓我們看到了AJAX與ASP.NET2.0緊密結合的快捷與高效,我們甚至可以無需寫一句JS代碼即可讓ASP.NET的網頁得到以往要花上數小時編寫的JS代碼所實現的無刷新效果。而將這一切結合到ASP.NET也是那麼的容易,只需將控件簡單地移到UPDATEPANEL控件之內再設置幾個參數即可實現。但是,在體驗AJAX.NET帶給開發者便利的同時,也會發現AJax.NET有時也並不是十全十美。就像筆者近日遇到ASP.Net2.0的Login控件在UPDATEPANEL內當成功驗證用戶信息後會刷新頁面的BUG,很顯然這是違背了AJax無刷新的原則了,之後經過分析Login控件內置的用戶身份信息驗證的方法發現如下代碼:

private void AttemptLogin()
{
        LoginCancelEventArgs args1 = new LoginCancelEventArgs();
        this.OnLoggingIn(args1);
        if (!args1.Cancel)
        {
            AuthenticateEventArgs args2 = new AuthenticateEventArgs();
            this.OnAuthenticate(args2);
            if (args2.Authenticated)
            {
                //用戶信息驗證成功後,為客戶端寫上COOKIE信息.
                FormsAuthentication.SetAuthCookIE(this.UserNameInternal, this.RememberMeSet);
                this.OnLoggedIn(EventArgs.Empty);

                //就是下面這句Response語句作怪,在UPDATEPANEL控件內執行轉向操作導致頁面刷新!
                this.Page.Response.Redirect(this.GetRedirectUrl(), false);
            }
        }
}

//驗證成功後可在此作一些處理,如把Login控件隱藏起來
            Login1.Visible = false;          
        }
        else
        {
            //由於不使用內置的驗證機制,那麼驗證失敗的處理要自己設置一下.
            (Login1.FindControl("FailureText") as Literal).Text = "用戶名或密碼不正確,請重試!";
        }
}

    分析上面代碼,其中因為Login控件要驗證的用戶信息都儲存在SQL2005的ASPnetdb數據庫的ASPnet_membership表,這樣我們只要使用Membership.ValidateUser這個方法就能輕松實現驗證用戶信息,當驗證成功後,按照上面分析的AttemptLogin方法為客戶端寫上COOKIE,再設置一下驗證失敗的出錯信息之後就輕松的把我們的Login控件改造為成功驗證用戶信息之後不再刷新了,這樣改造後的好處是不用像編寫自定義控件那樣復雜,並且效果和原來的Login控件是一模一樣的,也照樣能使用CreateUserWizard控件創建的用戶名進行驗證,而LoginStatus、LoginName等Login控件相關的控件也能如常使用。

PS:如果Login控件驗證用戶信息時出現PageRequestManagerParserErrorException錯誤,請檢查web.config是否有這句:
<httpModules>
.....
<add name="ScriptModule" type="Microsoft.Web.UI.ScriptModule, Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpModules>

感謝saucer提醒


    通過分析AttemptLogin方法不難看出,當我們按下Login控件的登錄Button並成功驗證用戶信息之後會執行一句Response.Redirect頁面轉向語句(即使沒有指定轉向頁也會執行這句代碼,默認為當前頁),而正是因為執行了頁面的轉向而導致了頁面的刷新。當知道出錯的原因之後就好辦了,可能這時會有人說自定義控件繼承Login控件並重寫AttemptLogin方法就可以了,但除了自定義控件之外還有沒有更簡單的方法呢?答案是肯定的,既然是內置的驗證機制造成頁面的刷新,那麼就索性不使用Login控件的驗證處理,而使用自定義一個方法去處理驗證用戶身份。首先為了使用自定義的驗證方法,我們先找到Login控件,並將其轉換成模板,然後在模板內找到LoginButton這個控件,將CommandName="Login" 去掉,這樣控件就不再使用內置的方法去驗證用戶信息了,跟著我們為LoginButton加上一個OnClick事件,代碼如下:

 

protected void LoginButton_Click(object sender, EventArgs e)
{
        //驗證用戶名及密碼是否正確
        if (Membership.ValidateUser(Login1.UserName, Login1.PassWord))
        {
            //根據上面分析Login的驗證機制,為客戶端寫上COOKIE.
            FormsAuthentication.SetAuthCookIE(Login1.UserName, Login1.RememberMeSet);

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved