Thứ Năm, 8 tháng 11, 2012

Chỉ cho phép người dùng nhập số vào textbox

Trong rất nhiều ứng dụng, ta thường thấy có một vài textbox chỉ cho phép nhập số hoặc một vài ký tự đặc biệt nào đó. Mục đích là để đảm bảo dữ liệu mà người dùng nhập vào luôn hợp lệ. Chỉ với thủ thuật nhỏ dưới đây, bạn sẽ giải quyết vấn đề trên một cách dễ dàng.

Để ràng buộc dữ liệu nhập vào của textbox, ta sẽ xử lý sự kiện KeyPress của nó. Sự kiện này có ở hầu hết các control của C# và nó xảy ra khi người dùng nhấn một phím bất kỳ trên bàn phím.

Code

View source
  1. private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
  2. {
  3.     string ValidChar = "0123456789" + Convert.ToChar(8).ToString();
  4.     if (!ValidChar.Contains(e.KeyChar))
  5.         e.Handled = true;
  6. }

Hoặc

  1. private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
  2. {
  3.     if (!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar))
                    e.Handled = true;
  4. }

Đầu tiên ta sẽ tạo một chuỗi chứa những ký tự được phép nhập. Tại sao lại có dòng + Convert.ToChar(8).ToString() ? Bởi vì khi người dùng nhập dữ liệu, họ sẽ cần đến phím backspace để xóa các ký tự. Do đó ta phải đưa phím backspace (có mã ASCII là 8) vào dãy các ký tự hợp lệ ở trên.

Dòng e.Handled = true; nghĩa là ta bỏ qua việc xử lý dữ liệu nhập vào của C#.

Như vậy, vấn đề đã được giải quyết chỉ với vài dòng code. Thật đơn giản phải không.

Chúc các bạn thành công.

#End


Thứ Hai, 5 tháng 11, 2012

C# – Tìm hiểu về Lambda Expression (Biểu thức Lambda)

Có thể nói so với anonymous method, lambda expression được coi là một sự cái tiến đáng giá từ phiên bản C# 2.0 lên C# 3.0. Khi dùng anonymous method, bạn có thể tạo các hàm in-line nhằm hạn chế việc khai báo các hàm riêng lẻ không cần thiết, giúp mã lệnh ngắn gọn hơn. Nay với lambda expression, bạn có thể viết ngắn gọn và dễ dàng hơn nhờ việc cung cấp toán tử và cú pháp mới, đồng thời thể hiện sự "thông minh" của compiler bằng cách tự nhận diện kiểu của dữ liệu. Ngoài ra, đây còn là kĩ thuật để tạo ra các kiểu expression tree mà ta sẽ bàn tới khi có dịp.

1. Gii thiu

Nếu chưa có khái niệm về gì về anonymous method, bạn có thể đọc bài hướng dẫn của tôi tại đây, việc này sẽ giúp bạn tiếp cận dễ dàng hơn những vấn đề sẽ được trình bày trong bài này. Ta có thể hình dung sự cải tiến kĩ thuật từ delegate đến lambda expression theo 3 bước:

-          Delegate

-          Anonymous method

-          Lambda expression

Vì thế hãy chuẩn bị những kiến thức nền tảng trước khi tiếp tục

2. Toán t Lambda:

Ta sẽ lấy một ví dụ tương tự trong phần bài anonymous method trước để bắt đầu. Bạn có một mảng các số nguyên kiểu int sau:

int[] numbers = { 10, 4, 3, 2, 8, 6, 5, 7, 9, 1 }; 

Ví dụ 1:
Bây giờ ta sẽ dùng anonymous method để in các phần tử trong mảng trên ra. Ta dùng phương thức tĩnh Array.ForEeach<T>(T[] array, Action<T> action), ở đây có thể bỏ đi phần định kiểu T. Compiler sẽ tự động hiểu và xác định kiểu dựa vào kiểu của tham số bạn truyền vào. Cụ thể ta viết như sau:

C# 2.0:

Array.ForEach(numbers, delegate(int x){ Console.WriteLine(x); }); 

Trong C# 3.0 ta có thể dùng cú pháp ngắn gọn hơn nữa để thực hiện điều này với cách hoạt động tương tự như với anonymous method. Ta viết lại đoạn mã trên như sau:

C# 3.0:

Array.ForEach(numbers, (int x) => { Console.WriteLine(x); });

Nếu chỉ có một lệnh cần thực thi ta có thể bỏ cặp dấu ngoặc nhọn đi "{}", và trong hầu hết trường hợp, compiler có thể đoán ra được kiểu dữ liệu của biến nên trong trường hợp này ta rút gọn lại như sau:

Array.ForEach(numbers, (x) => Console.WriteLine(x) );

Nếu chỉ có một tham số bạn có thể bỏ cặp dấu ngoặc đơn đi:

Array.ForEach(numbers, x => Console.WriteLine(x) );

Rõ ràng câu lệnh trên được đơn giản hóa khá nhiều so với ban đầu. Bạn có thể thấy điểm khác biệt là phần tham số và lệnh thực thi được ngăn cách với nhau bởi kí hiệu =>. Kí hiệu => này được gọi là toán tử lambda. Ta có dạng thức cơ bản của lambda expression như sau:

(parameter-list) =>  expression

Nếu không có tham số thì cú pháp sẽ như sau:

() => expression

Bây giờ ta thử làm một vài ví dụ đơn giản nữa để giúp bạn làm quen với kĩ thuật này. Mỗi ví dụ sẽ được viết với một phiên bản dùng anonymous method và sau đó là phiên bản dùng lambda expression để bạn dễ so sánh.

Ví dụ 2:

Ta sẽ sắp xếp mảng numbers trên theo thứ tự giảm dần. Ta sẽ sắp xếp bằng phương thức Array.Sort<T>(T[] array, Comparision<T> comparision).

Delegate Comparision<T> yêu cầu 2 tham số và trả về kiểu số tương tự như phương thức CompareTo() dùng để so sánh hai đối tượng (bạn có thể dùng phép trừ '-' để thay thế, để tường minh hơn nên tôi dùng CompareTo() để so sánh).

Ta có hai phiên bản để thực hiện yêu cầu này:

- Anonymous method:

Array.Sort(numbers, delegate(int x, int y)

{

return y.CompareTo(x);

});

-Lambda expression:

Array.Sort(numbers, (x,y) => y.CompareTo(x));

Ví dụ này tương tự như ví dụ đầu tiên trong bài, ngoại trừ việc nó phải return về một giá trị để so sánh. Như bạn thấy, lambda expression không cần dùng bất kì kí hiệu hay từ khóa gì để cho thấy rằng nó trả về một giá trị. Ta chỉ có thể nhận biết điều này dựa vào kết quả mà các biểu thức phía sau toán tử => trả về. Theo một cách hiểu khác, lambda expression luôn ngầm định trả về một giá trị như là void, int,…

Bạn có thể chỉ rõ việc trả về của các biểu thức sau toán tử => với từ khóa return, tuy nhiên nhớ dùng cặp ngoặc '{}' để bao chúng lại như trong anonymous method.

Ví dụ 3:

Vấn sử dụng các phương thức tĩnh trong lớp Array, ta sẽ kiểm tra xem các phần tử trong mảng numbers có tuân theo một quy luật nào đó không bằng cách sử dụng phương thức Array.TrueForAll<T>(T[] array, Predicate<T> match). Phương thức này sẽ kiểm tra tất cả các phần tử dựa vào quy tắc của delegate Predicate mà ta truyền vào. Nếu tất cả các phần tử trong mảng đều khớp thì sẽ trả về true, ngược lại sẽ trả về false nếu có ít nhất một phần tử không khớp. Ta có hai phiên bản sau:

- Anonymous method:

bool b=Array.TrueForAll(numbers, delegate(int x){

return x<11;

});

-Lambda expression:

bool b = Array.TrueForAll(numbers, x => x < 11);

Quy tắc so sánh ta dùng ở đây là mỗi phần tử phải bé hơn 11. Dĩ nhiên kết quả của phương thức TrueForAll() sẽ luôn trả về true vì như bạn thấy các phần tử của mảng numbers chỉ có 10 là lớn nhất. Bạn có thể in biến b ra để xác thực kết quả này.

3. Delegate Func<…>:

Trong phiên bản C# 3.0, đi kèm với việc ra đời của lambda expression, Microsoft cung cấp cho ta một kiểu delegate mới linh hoạt và tiện dụng hơn, tên của kiểu delegate này là Func.

Func cho phép khai báo và tạo ra các dạng delegate với số lượng tham số và kiểu trả về khác nhau, tương tự như khi bạn tạo ra một phương thức.

Func được dùng chủ yếu để tạo và lưu trữ một anonymous method ngắn gọn bằng lambda expression và được sử dụng như những phương thức thông thường. Cú pháp để sử dụng Func là viết các kiểu của tham số và giá trị trả về vào cặp ngoặc '<>', theo sau từ khóa Func.

Func<T,T,..,TResult>

Ở đây T là các kiểu của tham số cần truyền vào và TResult là kiểu của giá trị trả về. Chú ý là Func yêu cầu ít nhất một tham sô trong cặp '<>', tức là phải có kiểu trả về. Bạn không để đặt void hay để một cặp ngoặc '<>' rỗng khi dùng Func.

Một số ví dụ về khai báo Func:

+Yêu cầu một tham số kiểu string và trả về một giá trị int: lấy chiều dài của chuỗi.

Func<string, int> stringLength = s => s.Length;

Console.WriteLine(stringLength ("yinyang"));

+Yêu cầu 1 tham số float, 1 tham số và trả về kiểu float: tính tích của 2 số

Func<float, int, float> multiply = (x, y) => x * y;

Console.WriteLine(multiply (9f, 7));

+ Trả về max của 2 số:

Func<int, int, int> max = (x, y) => x>y?x:y;

Console.WriteLine(max(9, 7));

Như bạn thấy, nếu dùng anonymous method cho các ví dụ trên, vì là phương thức in-line nên bạn chỉ được gọi một lần duy nhất khi định nghĩa, muốn gọi ở nơi khác trong cùng một phương thức bạn phải định nghĩa lại. Nhưng ở đây Func cung cấp một cách thức để lưu trữ anonymous method cho phép bạn sử dụng nhiều lần mà không cần phải khai báo và định nghĩa phương thức bên ngoài, và tất nhiên là với cú pháp ngắn gọn hơn so với kiểu truyền thống.

4. Phần kết

Như vậy ta đã đi qua phần giới thiệu và cách sử dụng về lambda expression. Trong bài viết này, bạn đã biết được sự khác nhau giữa lambda expression với anonymous method và delegate, đồng thời thấy được sự tiện dụng của nó trong những ngữ cảnh cụ thể. Trong các bài viết tới tôi sẽ giới thiệu về expression tree để bạn nắm vững được những kĩ thuật mà công nghệ .Net đã và đang đem lại ra cho chúng ta.

C# – Tìm hiểu về Anonymous method

Anonymous method (tạm dịch là phương thức vô danh) là phương thức không có tên được khai báo với từ khóa delegate. Anonymous method cho phép bạn tạo ra các hành động cho một cho delegate với cách viết inline.

(Để nắm bắt được các vấn đề trình bày trong bài này, bạn cần có sẵn các kiến thức về delegate và generic method)

1. Giới thiệu

Giả sử bạn có một phương thức AddListItem() dùng để thêm một ListViewItem vào ListView. Bạn khai báo một delegete và tạo một thể hiện của nó để sử dụng:

delegate void AddListItemHandler(ListViewItem item);

private void AddListItem(ListViewItem item)

{

listView1.Items.Add(item);

}

AddListItemHandler addItemHandler = new AddListItemHandler(AddListItem);

Việc khai báo phương thức AddListItem nếu chỉ để sử dụng một lần cho delegate này thì có vẻ như không cần thiết. Thay vì viết như trên ta có thể sử dụng anonymous method để rút ngắn lại mã lệnh cần viết và hạn chế số lượng phương thức không cần thiết:

delegate void AddListItemHandler(ListViewItem item);

AddListItemHandler addItemHandler = delegate(ListViewItem item)

{

listView1.Items.Add(item);

};

Trong trường hợp viết mã lệnh xử lý cho các sự kiện của một đối tượng nào đó, bạn có thể sử dụng phương pháp này nếu như thấy thích hợp, chú ý các tham số phải khớp với delegate được khai báo:

button1.Click += delegate(object sender, EventArgs e)

{

MessageBox.Show("Bạn vừa click button1″);

};

2.     Sử dụng Predicate<T>, Action<T> và Comparison<T>

Đây là ba delegate được xây dựng sẵn và dùng khá nhiều trong C# 2. Chúng được khai báo như sau:

public delegate bool Predicate<T> (T obj)

public delegate void Action<T> (T obj)

public delegate int Comparison<T> (T x, T y)

Predicate<T> được sử dụng để kiểm tra các giá trị có thỏa mãn một điều kiện nào đó không, như bạn cũng có thể nó trả về kiểu bool.

Action<T> sử dụng để thực hiện các hành động với đối tượng mà bạn truyền vào, và không trả về giá trị nào cả.

Comparison<T> dùng để so sánh hai đối tượng cùng kiểu, thường sử dụng trong các trường hợp sắp xếp.

  • Predicate<T>

Để thấy được công dụng của nó, chúng ta thử đi  khảo sát lớp Array với các phương thức tĩnh của nó.  Bạn có thể thấy là lớp Array này cung cấp khá nhiều phương thức generic. Ta lấy ví dụ về phương thức thường được sử dụng là FindAll dùng để tìm tất cả các phần tử thỏa mãn điều kiện, nó được định nghĩa như sau:

T[] Array.FindAll<T>(T[] array, Predicate<T> match)

Một phương thức generic có thể làm việc với bất kì kiểu nào, điều này rõ ràng là cần thiết vì nó làm việc với bất kì mảng thuộc kiểu dữ liệu nào mà bạn truyền vào. Ở đây ta quan tâm tới tham số thứ hai Predicate<T> match là một delegate xác định điều kiện cho phần tử cần tìm kiếm. Ví dụ ta có một mảng int[]:

int[] array ={ 10, 4, 3, 2, 8, 6, 5, 7, 9, 1 };

Nhiệm vụ của ta là lấy ra tất cả phần tử chẵn trong mảng. Bằng cách sử dụng anonymous method ta có thể viết như sau:

int[] evens = Array.FindAll<int>(array, delegate(int n)

{

return n % 2 == 0;

});

Theo cách thông thường bạn không cần viết <int> vào sau tên phương thức, trình biên dịch sẽ tự động xác định kiểu của tham số.

int[] evens = Array.FindAll(array, delegate(int n)

{

return n % 2 == 0;

});

  • Action<T>

Bây giờ ta đã có một mảng evens chứa các số chẵn trong mảng array. Công việc tiếp theo là in chúng ra màn hình để xem kết quả. Bạn nghĩ tới việc dùng cấu trúc lặp foreach để làm việc này. Rất tốt nhưng vì đang bàn về chủ đề này nên ta sẽ tìm kiếm một cách thức khác tiện lợi hơn. Thật may mắn là nó nằm sẵn trong lớp Array với tên phương thức là ForEach (bạn cũng có thể tìm thấy phương thức này trong các kiểu collection khác).

Cú pháp của phương thức:

void Array.ForEach<T>(T[] array, Action<T> action)

Ở đây nếu bạn đã hiểu được các vấn đề được nói tới ở trên thì công việc lúc này trở nên rất đơn giản. Bạn có thể tự viết được mã lệnh để sử dụng phương thức ForEach này với anonymous method. Nếu chưa bạn cũng có thể xem cách làm tương tự như dưới đây:

Array.ForEach(evens, delegate(int n) { Console.WriteLine(n); });

Như bạn có thể thấy trong phần định nghĩa Predicate<T> và Action<T>, chúng yêu cầu duy nhất một tham số với kiểu bất kì. Ở trên vì đang làm việc với kiểu int nên ta sẽ truyền vào delegate kiểu int và tên biến tự đặt là n. Sau đó chỉ việc dùng tham số n này trong khối lệnh của anonymous method.

  • Comparison<T>

Một ngày đẹp trời bạn coi lại ví dụ này và thấy các phần tử của mảng sắp xếp quá lộn xộn, và bạn muốn sắp xếp lại chúng nhưng lại không muốn sử dụng các thuật toán sắp xếp. Bạn tìm và thấy phương thức Sort trong lớp Array và bắt đầu thực hiện, kết quả thật mĩ mãn. Bạn chú ý đến overload thứ 5 của phương thức Sort này, nó được định nghĩa:

void Array.Sort<T> (T[] array, Comparison<T> comparison)

Bạn thấy thích thú và muốn sử dụng nó, chú ý rằng nó yêu cầu hai tham số.

Array.Sort(evens, delegate(int x, int y)

{

return x.CompareTo(y);

});

Rất đơn giản nhưng bạn tự hỏi tại sao phải sử dụng cách này trong khi các overload khác của nó dễ sử dụng hơn nhiều? Đặt trường hợp bạn có một danh sách các đối tượng kiểu NhanVien có nhiều thuộc tính, và trong nhiều ngữ cảnh khác nhau, bạn cần sắp xếp danh sách này theo một thuộc tính riêng (chẳng hạn xếp theo tên, tuổi, lương,…) thì rõ ràng cách dùng Comparison<T> là linh hoạt và dễ dàng nhất.

3. Phần kết

Bạn đã làm quen và nắm được cơ bản cách sử dụng anonymous method, đây là một bước cần thiết để giúp bạn tiếp thu một kiến thức khác mà tôi sẽ giới thiệu trong các bài sau, đó là về Lambda Expression. Hy vọng bạn có thể áp dụng các kiến thức trong bài này trong việc giải quyết các vấn đề và phát triển ứng dụng của mình.

C# – Cơ bản Delegate (very basic)

Delegate là một kiến thức căn bản cần nắm vững khi bạn nhập môn C#, .NET. Mặc dù bạn có thể cho rằng delegate không cần thiết và tránh sử dụng nó (một cách trực tiếp) nhưng cuối cùng bạn vẫn phải nhận thấy rằng: mình không thể "sống" khi thiếu delegate. Delegate không khó hiểu cũng như không khó để áp dụng, nếu bạn dành một chút thời gian nghiên cứu.

Delegate là gì?

Trong tiếng Việt, delegate được dịch là "ủy nhiệm hàm", tuy nhiên mọi người đều không sử dụng từ này mà gọi bằng tên gốc là delegate. Thật tốt nếu bạn đã từng biết qua trong C/C++, đặc biệt về khái niệm con trỏ, bởi vì delegate tương tự như con trỏ hàm trong C++.

Một delegate giống như một "người đại diện" hay "đại sứ". Một delegate có thể được dùng để tạo một bao đóng (encapsulation) cho bất kì phương thức nào, miễn là nó phù hợp (kiểu trả về, tham số). Là một "đại sứ", delegate có thể triệu gọi phương thức bất kì nơi nào: từ đối tượng này đến đối tượng kia, từ thread này sang thread kia,… Đây là đặc điểm chính của delegate, bạn sẽ cần nhớ lại điều này khi giải quyết các vấn đề thường gặp như truyền dữ liệu giữa hai Form, xử lý lỗi "Cross-thread operation not valid", tạo event, …

Ngoài ra, bởi vì là một đối tượng, delegate có thể được truyền vào làm tham số của các phương thức. Bạn có thể hiểu đơn giản: delegate là một đối tượng dùng để bao đóng một hoặc nhiều phương thức (Multicast), hay có thể coi delegate là một sự kết hợp giữa đối tượng và phương thức.

Ta sẽ học cách sử dụng delegate qua 3 bước:

  •  Khai báo
  •  Khởi tạo
  • Thực thi

Khai báo

Là một đại diện của phương thức và là một kiểu dữ liệu, cách khai báo delegate giống như một sự kết hợp giữa khai báo đối tượng và phương thức. Một delegate được khai báo theo cú pháp sau:

[modifier] delegate return-type Identifier ([formal-parameters])

Trong đó:

  • modifier: phạm vi truy xuất (public, private, protected, internal)
  • delegate: từ khóa
  • return-type: kiểu dữ liệu trả về
  • Identifier: định danh của delegate
  • formal-parameters: danh sách các tham số hình thức

Các phần trong cặp ngoặc vuông [] là tùy chọn.

Ví dụ:

public delegate int DoSomething(int x, int y)

Khai báo một delegate có tên DoSomething, bạn có thể dùng delegate này đại diện cho bất kì phương thức nào yêu cầu hai tham số kiểu int và trả về kiểu int.

Khởi tạo

Giả sử  ta có một phương thức sau, có kiểu trả về và tham số tương ứng với delegate DoSomething trên:

int Add(int x,int y)
{
return x+y;
}

Khởi tạo delegate từ một phương thức có sẵn, bạn cần truyền phương thức mà delegate sẽ đại diện vào trong constructor. Bạn có thể khởi tạo delegate theo một trong hai cách sau. Chúng tương đương nhau khi được biên dịch:

// cách 1
DoSomething myDelegate = new DoSomething(Add)

// cách 2
DoSomething myDelegate = Add;

Hoặc sử dụng tên đầy đủ của phương thức:

DoSomething obj = MyNamespace1.Program.Add;

Thay vì tạo phương thức Add() trên, bạn có thể sử dụng anonymous method hoặc lambda expression để tạo đối tượng:

// anonymous method
DoSomething obj = delegate(int x,int y){
return x+y;
};

// lambda expression
DoSomething obj = (x,y) => x+y;

Thực thi

Có hai cách để bạn thực thi delegate.

Coi delegate như một phương thức:

myDelegate(a, b)

và như một đối tượng, bằng cách gọi phương thức Invoke():

myDelegate.Invoke(a, b)

Ví dụ

class Program {     public delegate int DoSomething(int x,int y);      public static void Main(string[] args)     {         Math m=new Math();         DoSomething obj = (x,y)=>x+y;          int value=obj(3,4);          Console.WriteLine(value); // output: 7         Console.ReadKey();     } } 

Tiếp theo là gì?

Sau khi hiểu được cơ bản delegate, bạn có thể cần tìm hiểu thêm về event. Trong .NET cũng có những delegate được tạo sẵn (build-in), bạn có thể tìm thấy các vấn đề này trong blog của tôi tại:

-          Anonymous Method

-          Lamdba Expression

-          Event

Một series hướng dẫn khá đầy đủ về delegate và event trên codeproject, bao gồm cả multicast delegate:

Thứ Tư, 31 tháng 10, 2012

Xu hướng mua hàng qua mạng

Cùng với sự phát triển của thương mại điện tử, việc mua hàng qua mạng không còn xa lạ với nhiều người trong thời buổi 'nhà nhà dùng mạng, người người online'.

Thông thường, khi có nhu cầu mua sắm, khách hàng đến các khu trung tâm thương mại, cửa hàng... Việc này tốn không ít thời gian và chi phí, người mua có thể tiếp cận thụ động với sản phẩm, hàng hóa không phong phú, ít sự lựa chọn.

Theo đó, nhiều người chọn mua đồ trên mạng, nhất là trong thời buổi Internet phát triển như hiện nay. Tuy nhiên, để tránh bị lừa, khách hàng nên chọn những "chợ" có uy tín trên mạng, cũng như tìm hiểu kỹ thông tin về sản phẩm, người bán, trước khi quyết định mua. Tận dụng thời gian, thời gian rảnh hoặc trong giờ nghỉ trưa, nhiều "dân" mạng online thỏa sức mua sắm, chỉ cần với một chiếc máy tính kết nối mạng.

Chỉ cần gõ tên sản phẩm cần mua vào những trang tìm kiếm như Google, Yahoo… hay các trang mạng xã hội như Facebook, Zing me..., bạn sẽ có vô số thông tin về sản phẩm, từ những nguồn cung cấp khác nhau. Với những ai thường xuyên mua hàng trên mạng có thể truy cập trực tiếp vào các website như  Vatgia, Enbac, 5giay, muachung,… Đó là những "siêu thị online", đem đến cho khách hàng nhiều sản phẩm và những lựa chọn khác nhau.

Chị Hương, ở Cầu Giấy, Hà Nội, người có thói quen săn các thẻ giảm giá trên mạng, cho biết những voucher ưu đãi hay sản phẩm thường được bán trên website mua sắm cộng đồng với giá khá rẻ, thậm chí mức giảm có khi lên đến 90%. Điều này giúp tiết kiệm được ngân sách chi tiêu của gia đình. Ngoài ra, sắm đồ trên mạng, chị còn được thỏa sức cân nhắc giá cả, mẫu mã mà không sợ bị chủ cửa hàng khó chịu, tiết kiệm thời gian đi lại khi mùa lạnh sắp về.

Thứ Ba, 2 tháng 10, 2012

www.*.Org .name .ac .info là gì ? giải thích ý nghĩa đuôi tên miền

Bạn đã từng đếm được xem mình đã xem bao nhiêu trang web chưa ?
Chắc là khó có thể thống kê được nhưng mình tin một điều không phải ai cũng biết được hết ý nghĩa các loại tên tên miền này.
Mình xin phép được chia sẻ ý nghĩa của một số đuôi tên miền phổ biến mà các bạn hay gặp.

1. Tên miền quốc tế có cấu trúc:
- Tên đăng ký, ví dụ như: google, yahoo, msn,...
- Tiếp theo là đuôi tên miền, ví dụ như: .com, .net, .edu, .org, .int, .gov, .info, .name ,...
Ví dụ tên miền quốc tế: google.com
2. Tên miền quốc gia:
Tên miền quốc gia sẽ được gắng thêm đuôi ký hiệu của các nước, ví dụ như: .vn (việt nam), .cn (Trung quốc), .uk (Anh Quốc),...
Ví dụ tên miền quốc gia: google.com.vn
Ý nghĩa một số đuôi tên miền
.COM: Dành cho tổ chức, cá nhân họat động thương mại.
.BIZ: Dành cho các tổ chức, cá nhân hoạt động kinh doanh, tương đương với COM.
.EDU: Dành cho các tổ chức, cá nhân hoạt động trong lĩnh vực giáo dục, đào tạo.
.GOV: Dành cho các cơ quan, tổ chức nhà nước ở trung ương và địa phương.
.NET: Dành cho các tổ chức, cá nhân hoạt động trong lĩnh vực thiết lập và cung cấp các dịch vụ trên mạng.
.ORG: Dành cho các tổ chức hoạt động trong lĩnh vực chính trị, văn hoá xã hội.
.INT: Dành cho các tổ chức quốc tế tại Việt Nam.
.AC: Dành cho các tổ chức, cá nhân hoạt động trong lĩnh vực nghiên cứu.
.PRO: Dành cho các tổ chức, cá nhân hoạt động trong những lĩnh vực có tính chuyên ngành cao.
.INFO: Dành cho các tổ chức hoạt động trong lĩnh vực sản xuất phân phối, cung cấp thông tin.
.HEALTH: Dành cho các tổ chức, cá nhân hoạt động trong lĩnh vực dược, y tế.
.NAME: Dành cho tên riêng của cá nhân tham gia hoạt động Internet

Lưu giữ Session của bạn với JQuery và ASP.NET

Khi bạn làm việc với Session trong ASP.NET điều đầu tiên bạn cần quan tâm đó là làm sao để Session không bị Timeout, mặc định thời gian timeout của 1 Session được cấu hình trong file Web.Config và có thời gian là 20 phút.

Ví dụ khi khách hàng đăng nhập vào hệ thống của bạn nếu Session timeout điều đó có nghĩa với khách hàng sẽ phải đăng nhập lại, điều này thường gây khó chịu cho một số người.

Để tránh điều này chúng ta sẽ sử dụng JQuery Ajax để cách 10s chúng ta sẽ lấy lại Session cho người dùng thông qua file Generic Handler (ASHX)

Đầu tiên bạn hãy tạo 1 file Generic Handler (ASHX) có tên là KeepSessionAlive.ashx

Code như sau:

code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class KeepSessionAlive : IHttpHandler ,IRequiresSessionState
{
 
    public void ProcessRequest(HttpContext context)
    {
        //khoi tao lai Session
        context.Session["KeepSessionAlive"] = DateTime.Now;
    }
 
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

Using thêm

code
1
using System.Web.SessionState;

trong class này bắt buộc chúng ta phải kế thừa thêm từ Interface IRequiresSessionState bởi nếu không khi biên dịch bạn sẽ gặp lỗi ở context.Session

Tiếp theo bạn vào file Default.aspx viết Javascript như sau:

code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script language="javascript" type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
    <script language="javascript" type="text/javascript">
        $(function() {
            setInterval(KeepSessionAlive, 10000);
        });
  
        function KeepSessionAlive() {          
            $.post("/KeepSessionAlive.ashx", null, function() {
                $("#result").append("<p>Session is alive and kicking!<p/>");
            });  
        }  
    </script>
    <h2>Will my session die?</h2>  
    <div id="result"></div>

Khi trang web được load lên tôi sẽ setInterval cho hàm KeepSessionAlive() là 10s 1 lần có nghĩa cứ 10s tôi sẽ gọi lại hàm KeepSessionAlive().

Trong hàm KeepSessionAlive() tôi sẽ post lên file KeepSessionAlive.ashx để khởi tạo lại Session.

Theo DotnetCurry

Liên kết quảng cáo :