Kế tiếp, bạn cần tạo trang đăng nhập. Trang đăng nhập có thể xác thực người dùng bằng 
password được viết cứng (phù hợp cho các thửnghiệm đơn giản), cơsởdữliệu phía server, 
hoặc bất kỳkiểu logic xác thực tùy biến nào. Một khi người dùng đã được xác thực thành 
công, bạn cần gọi phương thức tĩnh FormsAuthentication.RedirectFromLoginPage. Phương 
thức này sẽthiết lập authentication cookievà chuyển hướng người dùng đến trang được yêu 
cầu lúc đầu. 
Dưới đây là trang đăng nhập sơbộ, chỉkiểm tra một password cụthểkhi người dùng nhắp 
vào nút Login: 
using System; 
using System.Web; 
using System.Web.UI.WebControls; 
using System.Web.Security; 
public class LoginPage : System.Web.UI.Page { 
protected System.Web.UI.WebControls.Label lblStatus; 
protected System.Web.UI.WebControls.Button cmdLogin; 
protected System.Web.UI.WebControls.TextBox txtPassword; 
protected System.Web.UI.WebControls.TextBox txtName; 
// (Bỏqua phần mã designer.) 
private void cmdLogin_Click(object sender, System.EventArgs e){ 
if (txtPassword.Text.ToLower() == "secret"){ 
FormsAuthentication.RedirectFromLoginPage( 
txtName.Text, false); 
}else { 
lblStatus.Text = "Try again."; 
} 
} 
} 
Đểthửnghiệm trang đăng nhập trên, bạn hãy yêu cầu trang SecurePage.aspx(nằm trong thư
mục Secured). Bạn sẽbịchuyển hướng sang trang login.aspx, và nếu nhập đúng password, 
bạn sẽ được trảvềtrang SecurePage.aspx. 
              
                                            
                                
            
 
            
                 53 trang
53 trang | 
Chia sẻ: oanh_nt | Lượt xem: 1291 | Lượt tải: 2 
              
            Bạn đang xem trước 20 trang nội dung tài liệu Các giải pháp lập trình C# phần 5, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
212 
Chương 7: ASP.NET và Web Form 
Kế tiếp, bạn cần tạo trang đăng nhập. Trang đăng nhập có thể xác thực người dùng bằng 
password được viết cứng (phù hợp cho các thử nghiệm đơn giản), cơ sở dữ liệu phía server, 
hoặc bất kỳ kiểu logic xác thực tùy biến nào. Một khi người dùng đã được xác thực thành 
công, bạn cần gọi phương thức tĩnh FormsAuthentication.RedirectFromLoginPage. Phương 
thức này sẽ thiết lập authentication cookie và chuyển hướng người dùng đến trang được yêu 
cầu lúc đầu. 
Dưới đây là trang đăng nhập sơ bộ, chỉ kiểm tra một password cụ thể khi người dùng nhắp 
vào nút Login: 
using System; 
using System.Web; 
using System.Web.UI.WebControls; 
using System.Web.Security; 
public class LoginPage : System.Web.UI.Page { 
 protected System.Web.UI.WebControls.Label lblStatus; 
 protected System.Web.UI.WebControls.Button cmdLogin; 
 protected System.Web.UI.WebControls.TextBox txtPassword; 
 protected System.Web.UI.WebControls.TextBox txtName; 
 // (Bỏ qua phần mã designer.) 
 private void cmdLogin_Click(object sender, System.EventArgs e){ 
 if (txtPassword.Text.ToLower() == "secret") { 
 FormsAuthentication.RedirectFromLoginPage( 
 txtName.Text, false); 
 }else { 
 lblStatus.Text = "Try again."; 
 } 
 } 
} 
Để thử nghiệm trang đăng nhập trên, bạn hãy yêu cầu trang SecurePage.aspx (nằm trong thư 
mục Secured). Bạn sẽ bị chuyển hướng sang trang login.aspx, và nếu nhập đúng password, 
bạn sẽ được trả về trang SecurePage.aspx. 
Hình 7.7 Trang đăng nhập tùy biến 
213 
Chương 7: ASP.NET và Web Form 
7.10 Thực hiện xác nhận tính hợp lệ có-chọn-lựa 
 Bạn cần sử dụng các điều kiểm validator của ASP.NET. Tuy nhiên, bạn muốn 
kiểm tra bằng mã lệnh để có thể xác nhận tính hợp lệ chỉ các điều kiểm hay tập 
các điều kiểm nào đó, hoặc có thể tùy biến các thông báo lỗi dựa trên đầu vào 
không hợp lệ. 
 Vô hiệu thuộc tính EnableClientScript của mọi điều kiểm validator để trang có 
thể được post-back. Kế đó, sử dụng phương thức Page.Validate để xác nhận tính 
hợp lệ của trang hoặc phương thức BaseValidator.Validate để xác nhận tính hợp 
lệ của từng điều kiểm riêng rẽ. 
Điều kiểm validator của ASP.NET là giải pháp lý tưởng để xác nhận tính hợp lệ của form một 
cách nhanh chóng. Với điều kiểm validator, bạn có thể xác nhận tính hợp lệ của toàn bộ trang 
cùng một lúc. Nếu muốn xác nhận tính hợp lệ chỉ một phần form, hoặc muốn quyết định xem 
có cần xác định tính hợp lệ một điều kiểm nào đó hay không (dựa trên giá trị của một điều 
kiểm khác chẳng hạn), bạn sẽ cần thực hiện thao tác xác nhận tính hợp lệ có-chọn-lựa. 
Bước đầu tiên trong thao tác này là vô hiệu thuộc tính EnableClientScript của mọi điều kiểm 
validator trên trang. Nếu không, việc kiểm tra sẽ được thực hiện tại client thông qua 
JavaScript, trang sẽ không được post-back nếu nó chứa các giá trị không hợp lệ, và phần mã 
thụ lý sự kiện sẽ không được thực thi. Một khi đã thực hiện thay đổi này, bạn có thể xác nhận 
tính hợp lệ từng điều kiểm một bằng phương thức BaseValidator.Validate, hoặc xác nhận 
tính hợp lệ toàn bộ trang bằng phương thức Page.Validate. 
Ví dụ dưới đây thực hiện kiểm tra phía server với hai validator: RangeValidator và 
RegularExpressionValidator (xác nhận tính hợp lệ một địa chỉ e-mail). Nếu kiểm tra thất bại, 
đoạn mã này sẽ duyệt qua tập hợp các validator trên form bằng thuộc tính Page.Validators. 
Mỗi khi tìm thấy một validator có lỗi, nó sẽ tìm điều kiểm tương ứng bằng phương thức 
Page.FindControl rồi hiển thị giá trị lỗi. 
using System; 
using System.Web; 
using System.Web.UI.WebControls; 
public class SelectiveValidation : System.Web.UI.Page { 
 protected System.Web.UI.WebControls.TextBox txtNumber; 
 protected System.Web.UI.WebControls.TextBox txtEmail; 
 protected System.Web.UI.WebControls.Label lblCustomSummary; 
 protected System.Web.UI.WebControls.RegularExpressionValidator 
 validatorEmail; 
 protected System.Web.UI.WebControls.RangeValidator validatorNumber; 
 protected System.Web.UI.WebControls.Button cmdValidate; 
 // (Bỏ qua phần mã designer.) 
 private void cmdValidate_Click(object sender, System.EventArgs e) { 
 // Xác nhận tính hợp lệ của trang. 
 this.Validate(); 
 if (!Page.IsValid) { 
214 
Chương 7: ASP.NET và Web Form 
 lblCustomSummary.Text = ""; 
 foreach (BaseValidator validator in this.Validators) { 
 if (!validator.IsValid) { 
 TextBox invalidControl = (TextBox) 
 this.FindControl(validator.ControlToValidate); 
 lblCustomSummary.Text += 
 "The page contains the following error: " + 
 validator.ErrorMessage + "." + 
 "The invalid input is: " + 
 invalidControl.Text + "." + ""; 
 } 
 } 
 }else { 
 lblCustomSummary.Text = "Validation succeeded."; 
 } 
 } 
} 
Hình 7.8 Thực hiện thao tác xác nhận tính hợp lệ tùy biến 
7.11 Thêm động điều kiểm vào Web Form 
 Bạn cần thêm một điều kiểm web vào một trang web lúc thực thi và thụ lý các sự 
kiện của nó. 
 Tạo một đối tượng điều kiểm, thêm nó vào tập hợp Controls của một điều kiểm 
container, và sử dụng lệnh AddHandler để kết nối bất kỳ phương thức thụ lý sự 
kiện nào. Bạn phải tạo điều kiểm sau mỗi lần postback. 
215 
Chương 7: ASP.NET và Web Form 
Kỹ thuật thêm điều kiểm web vào trang web tương tự như kỹ thuật thêm điều kiểm Windows 
vào form, nhưng có một vài điểm khác, bao gồm: 
• Các điều kiểm được-tạo-động chỉ tồn tại đến lần postback kế tiếp. Nếu cần chúng, bạn 
phải tái tạo lại khi trang được trả về. Tuy nhiên, đòi hỏi này không ngăn bạn viết mã để 
thụ lý các sự kiện của chúng. 
• Việc định vị các điều kiểm được-tạo-động không mấy dễ dàng. Bạn nên sử dụng điều 
kiểm trực kiện (literal control) chứa mã HTML (như ) để phân cách các điều kiểm 
được-tạo-động. 
• Các điều kiểm được-tạo-động nên được đặt trong một điều kiểm container (như Panel) 
hơn là đặt trực tiếp lên trang. Điều này khiến cho việc định vị chúng dễ dàng hơn. 
• Nếu muốn tương tác với điều kiểm sau này, bạn nên cho nó một định danh (ID) duy 
nhất. Bạn có thể sử dụng ID này để thu lấy nó từ tập hợp Controls của điều kiểm 
container. 
Nơi tốt nhất để tạo các điều kiểm mới là trong phương thức thụ lý sự kiện Page.Load (bảo 
đảm điều kiểm sẽ được tạo mỗi khi trang được đáp ứng). Ngoài ra, nếu bạn thêm một điều 
kiểm nhập (input) sử dụng view state, thông tin view state sẽ được trả lại cho điều kiểm sau 
khi sự kiện Page.Load phát sinh. Tương tự, vì sự kiện Page.Load luôn phát sinh trước khi sự 
kiện nào khác diễn ra, bạn có thể tái tạo một điều kiểm dựng nên các sự kiện phía server, và 
phần mã thụ lý sự kiện của nó sẽ diễn ra ngay sau sự kiện Page.Load. 
Ví dụ dưới đây (xem hình 7.9) sẽ tạo động ba điều kiểm (hai Button và một TextBox) và định 
vị chúng bằng điều kiểm trực kiện (đóng vai trò là dấu phân cách). Hai Button được kết nối 
với các phương thức thụ lý sự kiện riêng biệt. TextBox được cấp một định danh duy nhất để 
phần text của nó có thể được thu lấy sau này (trong đáp ứng cho cú nhắp chuột vào Button). 
Hình 7.9 Các điều kiểm được-tạo-động 
using System; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.Security; 
216 
Chương 7: ASP.NET và Web Form 
public class DynamicControls : System.Web.UI.Page { 
 protected System.Web.UI.WebControls.Label lblMessage; 
 protected System.Web.UI.WebControls.Panel pnl; 
 // (Bỏ qua phần mã designer.) 
 private void Page_Load(object sender, System.EventArgs e) { 
 // Tạo Button. 
 Button dynamicButton = new Button(); 
 dynamicButton.Text = "Dynamic Button A"; 
 // Kết nối phương thức thụ lý sự kiện. 
 dynamicButton.Click += new EventHandler(cmdDynamicA_Click); 
 // Thêm Button vào Panel. 
 pnl.Controls.Add(dynamicButton); 
 // Thêm dấu ngắt dòng. 
 pnl.Controls.Add(new LiteralControl("")); 
 // Tạo Button thứ hai. 
 dynamicButton = new Button(); 
 dynamicButton.Text = "Dynamic Button B"; 
 dynamicButton.Click += new EventHandler(cmdDynamicB_Click); 
 pnl.Controls.Add(dynamicButton); 
 // Thêm dấu ngắt dòng. 
 pnl.Controls.Add(new LiteralControl("")); 
 // Tạo TextBox. 
 TextBox dynamicText = new TextBox(); 
 pnl.Controls.Add(dynamicText); 
 // Gán ID cho TextBox. 
 dynamicText.ID = "DynamicText"; 
 } 
 private void cmdDynamicA_Click(object sender, System.EventArgs e) { 
 lblMessage.Text = "Clicked A"; 
 GetText(); 
 } 
 private void cmdDynamicB_Click(object sender, System.EventArgs e) { 
 lblMessage.Text = "Clicked B"; 
 GetText(); 
 } 
 private void GetText(){ 
 lblMessage.Text += ""; 
 foreach (Control ctrl in pnl.Controls){ 
 if (ctrl.ID == "DynamicText"){ 
 lblMessage.Text += "TextBox contains: " + 
 ((TextBox)ctrl).Text; 
 } 
217 
Chương 7: ASP.NET và Web Form 
 } 
 } 
} 
Nếu cần tạo động các layout phức tạp (gồm các nhóm điều kiểm được tạo dựng trước), bạn có 
thể chuyển sang sử dụng điều kiểm người dùng và nạp động chúng vào trang. Kỹ thuật này sẽ 
được trình bày trong mục 7.13. 
7.12 Trả về động một bức hình 
 Bạn cần trả về động một bức hình (chẳng hạn, để tạo dựng kết xuất dạng biểu đồ 
hoặc đồ thị). 
 Tạo dựng bức hình bằng GDI+ và một đối tượng System.Drawing.Bitmap trong-bộ-
nhớ. Kế đó, bạn có thể ghi nó ra dòng kết xuất (output stream), hoặc lưu nó vào ổ 
đĩa cứng của server và hiển thị nó với điều kiểm web Image. 
Bạn có thể vẽ động các bức hình trong một ứng dụng Web bằng cách sử dụng cùng đoạn mã 
GDI+ đã sử dụng trong một ứng dụng dựa-trên-Windows. Chỉ có điểm khác là cách thức bạn 
trả về bức hình cuối cùng như thế nào. Về cơ bản, có hai cách tiếp cận mà bạn có thể sử dụng: 
• Bạn có thể đưa trực tiếp nội dung nhị phân của bức hình vào thuộc tính OutputStream 
của đối tượng HttpResponse. Đây là một cách tiếp cận hay nếu bạn không muốn làm 
đầy ổ đĩa cứng của server với các file hình không hề được sử dụng lại. Đây cũng là sự 
lựa chọn tốt nhất nếu bạn cần tạo động các bức hình được thiết kế để phù hợp với đầu 
vào của người dùng. 
• Bạn có thể lưu bức hình vào hệ thống file của web-server và sử dụng thẻ HTML 
để hiển thị nó. Đây là sự lựa chọn tốt nếu bạn cần tạo một bức hình sẽ được sử dụng lại, 
vì tránh được chi phí của việc tái tạo hình liên tục. 
Mục này khảo sát cả hai cách tiếp cận trên. Trước tiên, hãy xét cách tạo động một hình mà 
không lưu nó ra file. Trong ví dụ này, mục đích là tạo một banner đơn giản (xem hình 7.10). 
Hình 7.10 Một banner được-tạo-động 
218 
Chương 7: ASP.NET và Web Form 
Để ý rằng chỉ có phần text của banner là do người dùng cung cấp (thông qua chuỗi truy vấn). 
Font, màu, và kích thước được viết mã cứng (mặc dù chúng có thể được thiết lập dễ dàng dựa 
vào các đối số chuỗi truy vấn khác hoặc dựa vào file Web.config). 
Đoạn mã dưới đây sẽ trình bày cách tiếp cận này: 
using System; 
using System.Web; 
using System.Web.UI.WebControls; 
using System.Drawing; 
using System.Drawing.Drawing2D; 
public class DynamicGraphic : System.Web.UI.Page { 
 // (Bỏ qua phần mã designer.) 
 private void Page_Load(object sender, System.EventArgs e) { 
 // Lấy text từ chuỗi truy vấn. 
 // Nếu không có text, chọn mặc định. 
 string text = ""; 
 if (Request.QueryString["image"] == null) { 
 Response.Redirect(Request.Url + "?image=" + 
 Server.UrlEncode("This is a test image")); 
 } 
 else { 
 text = Server.UrlDecode(Request.QueryString["image"]); 
 } 
 // Tạo một hình bitmap trong-bộ-nhớ 
 // (rộng 300 pixel và cao 200 pixel). 
 int width = 300, height = 200; 
 Bitmap bitmap = new Bitmap(width, height); 
 // Lấy graphics context của hình bitmap. 
 Graphics graphics = Graphics.FromImage(bitmap); 
 // Thiết lập màu nền và chất lượng hình. 
 // Màu này sẽ trở thành đường viền. 
 graphics.Clear(Color.OrangeRed); 
 graphics.SmoothingMode = SmoothingMode.AntiAlias; 
 // Vẽ một hình chữ nhật. 
 graphics.FillRectangle(new SolidBrush(Color.Olive), 5, 5, 
 width - 10, height - 10); 
 // Chọn font và alignment cho text. 
 Font fontBanner = new Font("Verdana", 24, FontStyle.Bold); 
 StringFormat stringFormat = new StringFormat(); 
 stringFormat.Alignment = StringAlignment.Center; 
 stringFormat.LineAlignment = StringAlignment.Center; 
 // Vẽ text. 
 graphics.DrawString(text, fontBanner, 
 new SolidBrush(Color.LightYellow), 
 new Rectangle(0, 0, width, height), stringFormat); 
 // Lưu bức hình vào dòng kết xuất. 
 bitmap.Save(Response.OutputStream, 
219 
Chương 7: ASP.NET và Web Form 
 System.Drawing.Imaging.ImageFormat.Gif); 
 graphics.Dispose(); 
 bitmap.Dispose(); 
 } 
} 
Khi lưu bức hình vào dòng kết xuất, bạn sẽ thế chỗ bất kỳ kết xuất nào khác. Vì thế, bạn 
không thể sử dụng kỹ thuật này với một trang cũng có chứa Web controls hoặc nội dung 
HTML tĩnh. Theo đó, nếu muốn sử dụng một trang phối hợp các bức hình được-tạo-động và 
các điều kiểm web, bạn cần “bọc” bức hình được-tạo-động trong một điều kiểm hoặc ghi bức 
hình ra ổ đĩa cứng trước khi hiển thị nó. 
Nếu muốn lưu file vào ổ đĩa cứng, bạn cần chuyển phần mã tạo dựng bức hình thành một 
phương thức độc lập, mà chúng ta sẽ đặt tên là GenerateBanner. Kế đó, trong phương thức thụ 
lý sự kiện Page.Load, bạn kiểm tra xem file đã tồn tại chưa (sử dụng phương thức tĩnh 
File.Exists). Nếu file chưa tồn tại, bạn tạo nó trong bộ nhớ bằng phương thức 
GenerateBanner và lưu nó bằng phương thức Bitmap.Save. Nếu file đã tồn tại, bạn chỉ cần nạp 
thẳng bức hình này. 
Đoạn mã dưới đây sẽ trình bày cách tiếp cận này: 
using System; 
using System.IO; 
using System.Web; 
using System.Web.UI.WebControls; 
using System.Drawing; 
using System.Drawing.Drawing2D; 
public class DynamicGraphic : System.Web.UI.Page { 
 protected System.Web.UI.WebControls.Image imageControl; 
 // (Bỏ qua phần mã designer.) 
 private Bitmap GenerateBanner() { 
 // Tạo dựng bức hình, sử dụng phần mã trong ví dụ ở trên. 
 } 
 private void Page_Load(object sender, System.EventArgs e) { 
 // Thiết lập tên file. 
 // Giả sử chuỗi truy vấn chứa các ký tự hợp lệ cho tên file. 
 string fileName = Request.QueryString["image"] + ".gif"; 
 Bitmap bitmap = null; 
 // Kiểm tra bức hình với phần text này đã tồn tại hay chưa. 
 if (File.Exists(fileName)) { 
 // Nạp bức hình hiện có. 
 try { 
 bitmap = new Bitmap(fileName); 
 }catch { 
 bitmap = GenerateBanner(); 
 } 
 } 
 else { 
 bitmap = GenerateBanner(); 
 // Lưu bức hình. 
 bitmap.Save(fileName, 
220 
Chương 7: ASP.NET và Web Form 
 System.Drawing.Imaging.ImageFormat.Gif); 
 } 
 // Hiển thị bức hình. 
 imageControl.ImageUrl = fileName; 
 } 
} 
7.13 Nạp điều kiểm người dùng bằng mã lệnh 
 Bạn cần tạo dựng động giao diện người dùng (user interface) cho một trang từ một 
hoặc nhiều điều kiểm người dùng (user control). 
 Sử dụng phương thức Page.LoadControl để tạo đối tượng điều kiểm từ file .ascx, và 
rồi thêm nó vào tập hợp Controls của một điều kiểm container. 
Điều kiểm người dùng là các nhóm điều kiểm độc lập. Như Web Form, điều kiểm người dùng 
bao gồm phần layout định nghĩa các điều kiểm bên trong (file .ascx) và phần code-behind 
cùng với logic thụ lý sự kiện (file .cs). Điều kiểm người dùng cho phép bạn sử dụng lại các 
phần tử giao diện thông thường trên nhiều trang và tạo dựng các giao diện phức tạp từ các 
khối nhỏ hơn. Một đặc điểm hữu ích của điều kiểm người dùng là chúng có thể được nạp 
bằng mã lệnh, điều này cho phép bạn tạo một giao diện cấu hình cao do bạn thiết kế động y 
theo người dùng. Bạn chỉ cần nạp điều kiểm, cấu hình các thuộc tính của nó, và rồi thêm nó 
vào một điều kiểm container. 
Ví dụ, xét trang web đã tạo động các bức hình trong mục 7.12. Một giải pháp theo cách hướng 
đối tượng hơn có thể hiện thực được là tạo một điều kiểm người dùng tùy biến đóng gói bức 
hình được-tạo-động. Điều kiểm người dùng này cho phép trang thiết lập text, font, màu... 
thông qua các thuộc tính khác nhau. 
using System; 
using System.Web; 
using System.Web.UI.WebControls; 
using System.Drawing; 
using System.Drawing.Drawing2D; 
public class DynamicGraphicControl : System.Web.UI.UserControl { 
 // (Bỏ qua phần mã designer.) 
 private string imageText = ""; 
 public string ImageText { 
 get { 
 return imageText; 
 } 
 set { 
 imageText = value; 
 } 
 } 
 private Font textFont; 
 public Font TextFont { 
 get { 
 return textFont; 
 } 
 set { 
221 
Chương 7: ASP.NET và Web Form 
 textFont = value; 
 } 
 } 
 private Size imageSize; 
 public Size ImageSize { 
 get { 
 return imageSize; 
 } 
 set { 
 imageSize = value; 
 } 
 } 
 private Color foreColor; 
 public Color ForeColor { 
 get { 
 return foreColor; 
 } 
 set { 
 foreColor = value; 
 } 
 } 
 private Color backColor; 
 public Color BackColor { 
 get { 
 return backColor; 
 } 
 set { 
 backColor = value; 
 } 
 } 
 private Color borderColor; 
 public Color BorderColor { 
 get { 
 return borderColor; 
 } 
 set { 
 borderColor = value; 
 } 
 } 
 private void Page_Load(object sender, System.EventArgs e) { 
 if (ImageText == "") 
 return; 
 // Tạo một hình bitmap trong-bộ-nhớ. 
 Bitmap bitmap = new Bitmap(ImageSize.Width, ImageSize.Height); 
 // lấy graphics context của hình bitmap. 
 Graphics graphics = Graphics.FromImage(bitmap); 
 // Thiết lập màu nền và chất lượng hình. 
 // Màu này sẽ trở thành đường viền. 
 graphics.Clear(BorderColor); 
 graphics.SmoothingMode = SmoothingMode.AntiAlias; 
222 
Chương 7: ASP.NET và Web Form 
 // Vẽ một hình chữ nhật. 
 graphics.FillRectangle(new SolidBrush(BackColor), 5, 5, 
 ImageSize.Width - 10, ImageSize.Height - 10); 
 // Thiết lập alignment cho text. 
 StringFormat stringFormat = new StringFormat(); 
 stringFormat.Alignment = StringAlignment.Center; 
 stringFormat.LineAlignment = StringAlignment.Center; 
 // Vẽ text. 
 graphics.DrawString(ImageText, TextFont, 
 new SolidBrush(ForeColor), 
 new Rectangle(0, 0, ImageSize.Width, ImageSize.Height), 
 stringFormat); 
 // Lưu bức hình vào dòng kết xuất. 
 bitmap.Save(Response.OutputStream, 
 System.Drawing.Imaging.ImageFormat.Gif); 
 graphics.Dispose(); 
 bitmap.Dispose(); 
 } 
} 
Web Form nạp điều kiểm người dùng này trong phương thức thụ lý sự kiện Page.Load. Điều 
kiểm người dùng được đặt trong một Panel. Phương thức LoadControl trả về một đối tượng 
Control, và nó được ép kiểu thành lớp điều kiểm người dùng thích hợp. 
using System; 
using System.Web; 
using System.Web.UI.WebControls; 
using System.Drawing; 
public class DynamicControlTest : System.Web.UI.Page { 
 protected System.Web.UI.WebControls.Panel pnl; 
 // (Bỏ qua phần mã designer.) 
 private void Page_Load(object sender, System.EventArgs e) { 
 // Nạp điều kiểm. 
 DynamicGraphicControl ctrl; 
 ctrl = (DynamicGraphicControl) 
 Page.LoadControl("DynamicGraphicControl.ascx"); 
 // Cấu hình các thuộc tính của điều kiểm. 
 ctrl.ImageText = "This is a new banner test"; 
 ctrl.ImageSize = new Size(300, 200); 
 ctrl.TextFont = new Font("Verdana", 24, FontStyle.Bold); 
 ctrl.BackColor = Color.Olive; 
 ctrl.ForeColor = Color.LightYellow; 
 ctrl.BorderColor = Color.OrangeRed; 
 // Thêm điều kiểm vào Panel. 
 pnl.Controls.Add(ctrl); 
 } 
} 
Trong Visual Studio .NET, lớp điều kiểm người dùng luôn có hiệu lực vì các lớp đã được biên 
dịch thành .dll. Tuy nhiên, nếu điều kiểm người dùng không phải một bộ phận của dự án, bạn 
sẽ không có lớp điều kiểm người dùng và bạn sẽ không thể truy xuất bất kỳ thuộc tính hay 
223 
Chương 7: ASP.NET và Web Form 
phương thức nào của điều kiểm người dùng. Để khắc phục vấn đề này, bạn có thể tạo một lớp 
cơ sở hoặc một giao diện định nghĩa các chức năng cơ bản để có thể truy xuất vào bất kỳ điều 
kiểm người dùng tùy biến nào. 
 Để tìm hiểu kỹ hơn về kỹ thuật này, bạn hãy download IBuySpy portal case study 
tại []. Nó trình bày một layout khả-tùy-biến-cao được 
tạo dựng hoàn toàn từ các điều kiểm người dùng được-nạp-động. 
7.14 Sử dụng page-caching và fragment-caching 
 Bạn cần tăng hiệu năng bằng cách lưu giữ các trang được trả về. 
 Thêm chỉ thị OutputCache vào trang hoặc điều kiểm người dùng, và chỉ định trang 
sẽ được giữ trong cache bao lâu (tính theo giây). 
Việc sử dụng caching vừa phải có thể giảm bớt hiệu ứng thắt cổ chai (chẳng hạn, truy xuất cơ 
sở dữ liệu) và tăng toàn bộ hiệu năng của một website. Caching có hiệu quả lớn trong một site 
có lưu lượng cao. Ví dụ, xét xem điều gì sẽ xảy ra khi bạn lưu giữ một trang hiển thị kết quả 
của một truy vấn cơ sở dữ liệu. Nếu bạn lưu giữ trang này trong 1 phút, và trang này nhận 
được 10 yêu cầu trong khoảng thời gian đó, bạn sẽ giảm được 10 lần chi phí truy xuất cơ sở 
dữ liệu. 
Bạn có thể hiện thực caching một cách dễ dàng—chỉ cần thêm chỉ thị OutputCache vào trang 
web. Chỉ thị này phải được thêm vào file .aspx, chứ không phải file .cs. Ví dụ dưới đây lưu 
giữ một trang trong 20 giây: 
Và ví dụ dưới đây lưu giữ một trang trong 20 giây nhưng vẫn duy trì các bản sao tùy vào giá 
trị của các đối số chuỗi truy vấn: 
Bạn có thể thử nghiệm caching bằng một trang hiển thị ngày và giờ trên server. Bạn sẽ nhận 
thấy rằng các yêu cầu đến sau (đối với trang này) không khiến cho thời gian được tạo mới. 
Theo đó, thời gian cũ sẽ được hiển thị cho đến khi trang hết hiệu lực. 
Output-caching không hiệu quả trong các trường hợp sau đây: 
• Trang của bạn cần tự tùy biến y theo các thiết lập đặc thù của người dùng như thông tin 
xác thực (đối tượng User) hoặc trạng thái (đối tượng Session). Trong trường hợp này, 
nó không tạo cảm giác sử dụng lại cùng một trang cho tất cả các người dùng. 
• Trang của bạn chứa các điều kiểm post-back và dựng nên các sự kiện phía server. 
• Trang của bạn cần thực hiện một hành động khác (như ghi ra file nhật ký, nhập thông 
tin vào cơ sở dữ liệu, hoặc thay đổi một biến ứng dụng). Một trang được lưu giữ sẽ sử 
dụng lại toàn bộ HTML đã được trả về; phần mã cho trang bị bỏ qua. 
• Trang của bạn có chứa các dữ liệu cần phải được tạo cùng với các dữ liệu hiện hành. 
Đây là trường hợp đối với tìm kiếm sản phẩm, nhưng không phải là trường hợp đối với 
danh mục sản phẩm. 
224 
Chương 7: ASP.NET và Web Form 
Trong các trường hợp này, bạn có thể sử dụng một dạng caching linh hoạt hơn. Bạn có thể sử 
dụng data-caching (sẽ được mô tả trong mục 7.15) để lưu giữ một đối tượng cụ thể. Hoặc bạn 
có thể sử dụng fragment-caching để lưu giữ một phần của trang. Để sử dụng fragment-
caching, bạn cần tạo một điều kiểm người dùng chứa tất cả nội dung có thể được lưu giữ và 
thêm chỉ thị OutputCache vào điều kiểm người dùng. Khi đó, bạn có thể sử dụng điều kiểm 
người dùng này trong một trang web. Phần mã cho trang web vẫn sẽ chạy, nhưng phần điều 
kiểm người dùng có thể được lưu giữ. 
7.15 Dùng lại dữ liệu với ASP.NET Cache 
 Bạn cần sử dụng caching, nhưng bạn không thể lưu giữ toàn bộ một trang vì nó 
chứa một số mã cần phải chạy hoặc một số nội dung cần phải được tạo động. 
 Sử dụng phương thức Cache.Insert để lưu giữ bất kỳ đối tượng nào với chính sách 
hết hiệu lực trượt (sliding expiration) hoặc hết hiệu lực tuyệt đối (absolute 
expiration). 
Đối tượng Cache cho phép bạn lưu giữ hầu như bất kỳ đối tượng .NET nào bằng một khóa 
chuỗi cùng với chính sách hết hiệu lực do bạn định nghĩa. ASP.NET duy trì cache một cách tự 
động, gỡ bỏ các đối tượng khi chúng hết hiệu lực hoặc khi cạn bộ nhớ. 
Có hai kiểu chính sách hết hiệu lực bạn có thể sử dụng khi lưu giữ dữ liệu trong cache. Hết 
hiệu lực tuyệt đối (absolute expiration) làm mất hiệu lực các item đã được lưu giữ sau một 
khoảng thời gian cố định, gần giống với output-caching. Hết hiệu lực tuyệt đối là cách tiếp 
cận tốt nhất nếu bạn muốn lưu giữ các thông tin cần được làm tươi định kỳ (như danh mục 
sản phầm). 
// Lưu giữ ObjectToCache trong 10 phút (với khóa là "Catalog"). 
// TimeSpan.Zero cho biết "không sử dụng sliding expiration". 
Cache.Insert("Catalog", ObjectToCache, null, 
 DateTime.Now.AddMinutes(10), TimeSpan.Zero); 
Hết hiệu lực trượt (sliding expiration) gỡ bỏ các đối tượng sau một khoảng thời gian không 
dùng đến. Trong trường hợp này, mỗi khi đối tượng được truy xuất, thời gian sống của nó sẽ 
được reset. Hết hiệu lực trượt làm việc tốt khi bạn có các thông tin luôn có hiệu lực nhưng 
luôn không được sử dụng (như dữ liệu thuộc về quá khứ). Thông tin này không cần được làm 
tươi, nhưng không nên giữ nó trong cache nếu nó không được sử dụng. 
// Lưu giữ ObjectToCache nếu nó được sử dụng ít nhất 
// một lần mỗi 10 phút (với khóa là "Catalog"). 
// DateTime.MaxValue cho biết "không sử dụng absolute expiration". 
Cache.Insert("Catalog", ObjectToCache, null, 
 DateTime.MaxValue, TimeSpan.FromMinutes(10)); 
Bạn có thể lấy các item từ cache bằng tên khóa. Tuy nhiên, bạn phải luôn kiểm tra trước xem 
item có tồn tại hay không và rồi ép nó thành kiểu như mong muốn. 
Khi thêm các đối tượng vào cache, cách tốt nhất là tạo một hàm độc lập có thể tái tạo đối 
tượng khi cần. Ví dụ, nếu đang lưu giữ một DataSet, bạn cần tạo một hàm kiểm tra cache và 
chỉ truy vấn lại cơ sở dữ liệu khi không tìm thấy DataSet.
            Các file đính kèm theo tài liệu này:
 cac_giai_phap_lap_trinh_c_sharp_split_5.pdf cac_giai_phap_lap_trinh_c_sharp_split_5.pdf