Silverlight 4 + RIA Services: Ready for Business: Cập nhật dữ liệu từ client


Để tiếp tục loạt bài, chúng ta hãy xem qua phần cập nhật dữ liệu. Tôi đã tạo một file có tên Plates.xaml có cấu trúc rất giống ở trên. Để xem chi tiết cách tạo file này, xin hãy xem các bước demo của tôi tại PDC 09.

image_thumb[49]

Giờ hãy xem qua phần cập nhật dữ liệu cho Plate.

Đầu tiên ta sẽ tạo một số form mặc nhiên bằng cách kéo một thực thể từ cửa số DataSources giống hệt các ta đã làm trước đây.

image_thumb[50]

Nhưng trước khi tạo giao diện, hãy chú ý thứ tự các trường – chúng sẽ khớp với thứ tự chúng được tạo trên giao diện. Chúng được đặt theo thứ tự trong bảng chữ cái, nhưng đó lại không phải thứ bạn luôn mong muốn. Ví dụ theo tôi thường thì Name phải được đặt đầu tiên.

image_thumb[52]

Để giải quyết vấn đề này, trong server project, mở DishViewService.metadata.cs và thêm vào thuộc tính Display vào trường Name của lớp Plate. Tiện thể, “Number Updates” cũng không phải là một cái tên tốt để hiển thị trên giao diện, vậy nên ta sẽ sửa thành một cái tên khác dễ hiểu hơn.

[Display(Order = 0)]
public string Name { get; set; }
[Display(Name="Update Count")]
public Nullable<int> NumberUpdates { get; set; }

Giờ quay lại dự án client, chúng ta sẽ thấy Name nằm ở vị trí đầu tiên:

image_thumb[54]

và khi thả nó lên form, ta sẽ thấy Update Count:

image_thumb[55]

Giờ ta đã có một form, và nó đã được gắn vào cùng datasource trên grid. Ta hãy thêm vào một nút để lưu lại các thay đổi.

image_thumb[56]

và thực hiện liên kết thuộc tính Command của nó (sẽ được gọi khi nút được nhấn).

image_thumb[57]

Giờ chúng ta cần gán nó cho lệnh Submit trên DomainDataSource. Vậy nên ta sẽ dùng gắn nối element với element. Chọn platDomainDataSource:

image_thumb[61]

Sau đó chọn đường dẫn đến SubmitChangesCommand

image_thumb[63]

Nếu bạn làm đúng thì nút bấm này sẽ bị disable (ngay cả trên giao diện thiết kế… vì dù sao hiện tại cũng không có thay đổi gì đề cập nhật).

image_thumb[64]

Giờ chạy và xem kết quả

image_thumb[67]

Chú ý là khi bạn thay đổi mục chọn trong bảng, giao diện chi tiết cũng sẽ được tự động cập nhật, mà chưa cần viết dòng lệnh nào. Cũng chú ý thêm là nút Save sẽ bị disable cho tới khi có thay đổi nào đó cần gửi lên server. Muốn thử thêm một nút “Cancel”? để hủy các thay đổi, vô cùng dễ dàng để thực hiện với RejectChangesCommand với cùng cách như trên.

Giờ hãy xem cập nhật đã thực sự thực hiện trong CSDL. Đặt một break point như sau:

image_thumb[69]

Ta sẽ thấy phương thức này được gọi hai lần cho mỗi thay đổi của thực thể trên client.

Giờ thêm một ít quy tắc vào phần cập nhật:

  1:         public void UpdatePlate(Plate currentPlate)
  2:         {
  3:             currentPlate.NumberUpdates++;
  4:
  5:             var orginal = this.ChangeSet.GetOriginal(currentPlate);
  6:
  7:             if (orginal.Price != currentPlate.Price)
  8:             {
  9:                 // add 1 dollar fee for changing price
 10:                 currentPlate.Price += 1;
 11:             }
 12:         }

Dòng 3, ta cập nhật biến đếm NumberUpdates, sau đó nếu giá tiền của mục này thay đổi, ta thêm vào phí là 1 đô la. Ta thấy có thể dễ dàng kiểm tra để xem liệu giá trị này đã bị thay đổi chưa từ góc độ của client bằng cách kiểm tra nó với giá trị gốc. Client sẽ gửi lại giá trị gốc của đối tượng mà nó dọc được ban đầu cho server, được dùng để kiểm tra liệu giá trị trên server có bị thay đổi bởi người dùng khác hay chưa (tức được coi như khóa kiểm tra truy cập đồng thời). (Đây là một thay đổi nhỏ so với phiên bản trước đây, khi mà tất cả các giá trị gốc đều được gửi lại server). Ví dụ, với một cập nhật mà nó chỉ thay đổi Calorie, xem đối tượng gốc, ta thấy:

image_thumb[77]

Nếu muốn thêm giá trị của Price vào các lệnh cập nhật, bạn cần đánh dấu nó như khóa kiểm tra truy cập đồng thời, để làm điều này bạn chọn trường này trong cửa sổ thiết kế và thay đổi giá trị của Concurency Mode thành “Fixed”.

image_thumb[72]

image_thumb[71]

Với thay đổi này, giá trị gốc của Price luôn được gửi trả lại cho server, việc này chỉ tiêu tốn một chút tài nguyên đối với hầu hết trường hợp, vậy nên theo tôi bạn nên làm bất cứ khi nào việc xử lý cần đến.

image_thumb[79]

3 thoughts on “Silverlight 4 + RIA Services: Ready for Business: Cập nhật dữ liệu từ client

  1. Chào anh,
    Mình đang đọc loạt bài này của anh. Nếu tiện anh cho biết vậy mình muốn thêm mới dữ liệu mà dùng luôn các control trong entry này thì làm sao ạ, hiện giờ mình đang kéo thả rất nhanh, còn muốn thêm mới thì phải làm thủ công à.
    Cảm ơn anh nhiều.

  2. Chào anh Nam!
    Ý mình là trong bài viết này đề cập đến việc chỉnh sửa dữ liệu đã có, còn mình muốn thêm mới dữ liệu hay xóa thì mình phải viết phần code riêng cho nó à. Tức là tạo ra các label, textbox, button trong 1 Panel riêng rồi xử lý phần thêm mới cho nó?
    Cảm ơn anh reply.

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s