Tải bản đầy đủ (.pdf) (10 trang)

Các giải pháp lập trình CSharp- P27 pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.61 MB, 10 trang )

261
Chương 7: ASP.NET và Web Form
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

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();
262
Chương 7: ASP.NET và Web Form
if (!Page.IsValid) {

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: <b>" +
validator.ErrorMessage + "</b>.<br>" +
"The invalid input is: <b>" +
invalidControl.Text + "</b>." + "<br><br>";
}
}
}else {
lblCustomSummary.Text = "Validation succeeded.";
}
}
}
263
Chương 7: ASP.NET và Web Form
Hình 7.8
Thực hiện thao tác xác nhận tính hợp lệ tùy biến
11.
11.
Thêm đ ng đi u ki m vào Web Formộ ề ể
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.
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ư
<br>
) để 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
264
Chương 7: ASP.NET và Web Form
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;
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.)
265
Chương 7: ASP.NET và Web Form
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("<br>"));
// 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("<br><br>"));
// 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();
}
266
Chương 7: ASP.NET và Web Form

private void cmdDynamicB_Click(object sender, System.EventArgs e) {

lblMessage.Text = "Clicked B";
GetText();
}
private void GetText(){
lblMessage.Text += "<br><br>";
foreach (Control ctrl in pnl.Controls){
if (ctrl.ID == "DynamicText"){
lblMessage.Text += "TextBox contains: " +
((TextBox)ctrl).Text;
}
}
}

}
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.
12.
12.
Tr v đ ng m t b c hìnhả ề ộ ộ ứ
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.
267
Chương 7: ASP.NET và Web Form

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
<img>
để 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
Để ý 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) {
268
Chương 7: ASP.NET và Web Form

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);
269
Chương 7: ASP.NET và Web Form
// 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();
}
}
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) {
270
Chương 7: ASP.NET và Web Form

// 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,
System.Drawing.Imaging.ImageFormat.Gif);
}
// Hiển thị bức hình.
imageControl.ImageUrl = fileName;
}
}
13.
13.
N p đi u ki m ng i dùng b ng mã l nhạ ề ể ườ ằ ệ
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.

×