隨著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);
}
}
}
通過分析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);
//驗證成功后可在此作一些處理,如把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提醒
新聞熱點
疑難解答