ด้วยการเปิดตัว AJAX.NET BETA 2 วันนี้ เราได้เห็นว่าการรวม AJAX และ ASP.NET 2.0 เข้าด้วยกันอย่างรวดเร็วและมีประสิทธิภาพเพียงใด เรายังสามารถทำให้หน้าเว็บ ASP.NET มีประสิทธิภาพมากขึ้นโดยไม่ต้องเขียนโค้ด JS แม้แต่ตัวเดียว เอฟเฟกต์ฟรีทำได้โดยเขียนโค้ด JS หลายชั่วโมง มันง่ายมากที่จะรวมทั้งหมดนี้เข้ากับ ASP.NET คุณเพียงแค่ต้องย้ายการควบคุมไปยังตัวควบคุม UPDATEPANEL และตั้งค่าพารามิเตอร์สองสามตัว อย่างไรก็ตาม ในขณะที่สัมผัสความสะดวกสบายที่ AJAX.NET มอบให้กับนักพัฒนา คุณจะพบว่าบางครั้ง AJAX.NET ก็ไม่สมบูรณ์แบบ เช่นเดียวกับที่ผู้เขียนพบข้อผิดพลาดในการควบคุมการเข้าสู่ระบบ ASP.NET 2.0 ที่รีเฟรชหน้าหลังจากตรวจสอบข้อมูลผู้ใช้ใน UPDATEPANEL เรียบร้อยแล้ว เห็นได้ชัดว่าสิ่งนี้ละเมิดหลักการของ AJAX ไม่มีการรีเฟรช หลังจากวิเคราะห์ข้อมูลผู้ใช้ที่สร้างไว้ในการควบคุมการเข้าสู่ระบบ วิธีการตรวจสอบข้อมูลประจำตัวพบรหัสต่อไปนี้:
private void AttemptLogin()
-
LoginCancelEventArgs args1 = LoginCancelEventArgs ใหม่ ();
นี้ OnLoggingIn (args1);
ถ้า (!args1.ยกเลิก)
-
AuthenticateEventArgs args2 = AuthenticateEventArgs ใหม่ ();
นี้ OnAuthenticate (args2);
ถ้า (args2.รับรองความถูกต้อง)
-
//หลังจากข้อมูลผู้ใช้ได้รับการตรวจสอบเรียบร้อยแล้ว ให้เขียนข้อมูลคุกกี้สำหรับลูกค้า
FormsAuthentication.SetAuthCookie (this.UserNameInternal, this.RememberMeSet);
this.OnLoggedIn(EventArgs.Empty);
//เป็นคำสั่งตอบกลับต่อไปนี้ที่ทำให้เกิดปัญหา การดำเนินการเปลี่ยนเส้นทางในตัวควบคุม UPDATEPANEL ทำให้เพจรีเฟรช!
this.Page.Response.Redirect(this.GetRedirectUrl(), เท็จ);
-
-
-
ด้วยการวิเคราะห์วิธีการ AttemptLogin จึงไม่ยากที่จะเห็นว่าเมื่อเรากดปุ่มเข้าสู่ระบบของส่วนควบคุมการเข้าสู่ระบบและตรวจสอบข้อมูลผู้ใช้สำเร็จ คำสั่งการเปลี่ยนเส้นทางหน้า Response.Redirect จะถูกดำเนินการ (รหัสนี้จะถูกดำเนินการแม้ว่าจะมีการเปลี่ยนเส้นทางก็ตาม ไม่ได้ระบุเพจ และค่าเริ่มต้นคือเพจปัจจุบัน) และเป็นเพราะการเปลี่ยนเส้นทางเพจที่รีเฟรชเพจ เมื่อคุณทราบสาเหตุของข้อผิดพลาดแล้ว อาจมีบางคนบอกว่าการควบคุมแบบกำหนดเองสามารถสืบทอดการควบคุมการเข้าสู่ระบบและแทนที่วิธี AttemptLogin แต่มีวิธีอื่นที่ง่ายกว่านี้นอกเหนือจากการควบคุมแบบกำหนดเองหรือไม่ คำตอบคือ ใช่ เนื่องจากเป็นกลไกการตรวจสอบในตัวที่ทำให้เพจรีเฟรช ดังนั้นอย่าใช้การประมวลผลการตรวจสอบของส่วนควบคุมการเข้าสู่ระบบ แต่ให้ใช้วิธีการที่กำหนดเองเพื่อจัดการการตรวจสอบตัวตนของผู้ใช้ ขั้นแรก เพื่อใช้วิธีการตรวจสอบแบบกำหนดเอง ขั้นแรกเราจะค้นหาส่วนควบคุมการเข้าสู่ระบบและแปลงเป็นเทมเพลต จากนั้นเราจะค้นหาส่วนควบคุม LoginButton ในเทมเพลตและลบ CommandName="Login" เพื่อให้ตัวควบคุมไม่ใช้ฟังก์ชันบิวท์อินอีกต่อไป ในวิธีการตรวจสอบ ตอนนี้เรามีข้อมูลผู้ใช้แล้ว เรามาเพิ่มเหตุการณ์ OnClick ให้กับ LoginButton กันดีกว่า โดยมีโค้ดดังนี้
โมฆะที่ได้รับการป้องกัน LoginButton_Click (ผู้ส่งวัตถุ EventArgs e)
-
//ตรวจสอบว่าชื่อผู้ใช้และรหัสผ่านถูกต้องหรือไม่
ถ้า (Membership.ValidateUser(Login1.UserName, Login1.Password))
-
//ตามการวิเคราะห์ข้างต้นของกลไกการตรวจสอบการเข้าสู่ระบบ ให้เขียนคุกกี้ให้กับลูกค้า
FormsAuthentication.SetAuthCookie (Login1.UserName, Login1.RememberMeSet);
//หลังจากยืนยันสำเร็จแล้ว คุณสามารถดำเนินการบางอย่างได้ที่นี่ เช่น ซ่อนส่วนควบคุมการเข้าสู่ระบบ
Login1.Visible = เท็จ;
-
อื่น
-
//เนื่องจากไม่ได้ใช้กลไกการยืนยันในตัว คุณจึงต้องตั้งค่าการจัดการความล้มเหลวในการยืนยันด้วยตัวเอง
(Login1.FindControl("FailureText") as Literal).Text = "ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง โปรดลองอีกครั้ง!";
-
}
วิเคราะห์โค้ดข้างต้น ข้อมูลผู้ใช้ที่จะตรวจสอบโดยการควบคุมการเข้าสู่ระบบจะถูกเก็บไว้ในตาราง aspnet_membership ของฐานข้อมูล Aspnetdb ของ SQL2005 ด้วยวิธีนี้ เราสามารถตรวจสอบข้อมูลผู้ใช้ได้อย่างง่ายดายโดยใช้เมธอด Membership.ValidateUser การตรวจสอบเสร็จสมบูรณ์ ให้ปฏิบัติตามการวิเคราะห์ข้างต้น วิธี AttemptLogin เขียนคุกกี้สำหรับไคลเอ็นต์ จากนั้นตั้งค่าข้อความแสดงข้อผิดพลาดสำหรับการตรวจสอบที่ล้มเหลว จากนั้นเราสามารถเปลี่ยนการควบคุมการเข้าสู่ระบบของเราให้ไม่รีเฟรชอีกต่อไปหลังจากตรวจสอบข้อมูลผู้ใช้สำเร็จแล้ว คือไม่จำเป็นต้องเขียนแบบกำหนดเอง การควบคุมนั้นซับซ้อนเท่ากับการควบคุมการเข้าสู่ระบบดั้งเดิม และเอฟเฟกต์จะเหมือนกับการควบคุมการเข้าสู่ระบบดั้งเดิมทุกประการ ชื่อผู้ใช้ที่สร้างโดยการควบคุม CreateUserWizard ยังคงสามารถใช้เพื่อการตรวจสอบและการควบคุมได้ ที่เกี่ยวข้องกับการควบคุมการเข้าสู่ระบบเช่น LoginStatus และ LoginName ก็สามารถใช้งานได้ตามปกติ
PS: หาก PageRequestManagerParserErrorException เกิดขึ้นเมื่อส่วนควบคุมการเข้าสู่ระบบตรวจสอบข้อมูลผู้ใช้ โปรดตรวจสอบว่า web.config มีประโยคนี้หรือไม่:
-
<เพิ่มชื่อ = "ScriptModule" type = "Microsoft.Web.UI.ScriptModule, Microsoft.Web.Extensions, Version = 1.0.61025.0, วัฒนธรรม =เป็นกลาง, PublicKeyToken = 31bf3856ad364e35"/>
ขอขอบคุณจานรองที่เตือน
http://www.cnblogs.com/aspxcn/archive/2006/11/07/552927.html