隨著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);
}
}
}
protected void LoginButton_Click(object sender, EventArgs e) 分析上面代碼,其中因為Login控件要驗證的用戶信息都儲存在SQL2005的Aspnetdb數據庫的aspnet_membership表,這樣我們只要使用Membership.ValidateUser這個方法就能輕松實現驗證用戶信息,當驗證成功后,按照上面分析的AttemptLogin方法為客戶端寫上COOKIE,再設置一下驗證失敗的出錯信息之后就輕松的把我們的Login控件改造為成功驗證用戶信息之后不再刷新了,這樣改造后的好處是不用像編寫自定義控件那樣復雜,并且效果和原來的Login控件是一模一樣的,也照樣能使用CreateUserWizard控件創建的用戶名進行驗證,而LoginStatus、LoginName等Login控件相關的控件也能如常使用。 PS:如果Login控件驗證用戶信息時出現PageRequestManagerParserErrorException錯誤,請檢查web.config是否有這句: 感謝saucer提醒 http://m.survivalescaperooms.com/aspxcn/archive/2006/11/07/552927.html
通過分析AttemptLogin方法不難看出,當我們按下Login控件的登錄Button并成功驗證用戶信息之后會執行一句Response.Redirect頁面轉向語句(即使沒有指定轉向頁也會執行這句代碼,默認為當前頁),而正是因為執行了頁面的轉向而導致了頁面的刷新。當知道出錯的原因之后就好辦了,可能這時會有人說自定義控件繼承Login控件并重寫AttemptLogin方法就可以了,但除了自定義控件之外還有沒有更簡單的方法呢?答案是肯定的,既然是內置的驗證機制造成頁面的刷新,那么就索性不使用Login控件的驗證處理,而使用自定義一個方法去處理驗證用戶身份。首先為了使用自定義的驗證方法,我們先找到Login控件,并將其轉換成
{
//驗證用戶名及密碼是否正確
if (Membership.ValidateUser(Login1.UserName, Login1.PassWord))
{
//根據上面分析Login的驗證機制,為客戶端寫上COOKIE.
FormsAuthentication.SetAuthCookie(Login1.UserName, Login1.RememberMeSet);
//驗證成功后可在此作一些處理,如把Login控件隱藏起來
Login1.Visible = false;
}
else
{
//由于不使用內置的驗證機制,那么驗證失敗的處理要自己設置一下.
(Login1.FindControl("FailureText") as Literal).Text = "用戶名或密碼不正確,請重試!";
}
}
<httpModules>
.....
<add name="ScriptModule" type="Microsoft.Web.UI.ScriptModule, Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpModules>
新聞熱點
疑難解答