ASP.NET 3.5 - Bài 7: Dynamic Data với LINQ to SQL
ASP.NET Dynamic Data cung cấp một Framework cho phép chúng ta nhanh chóng xây dựng
một chức năng ứng dụng driver-data, dựa trên LINQ to SQL hay Entity Framework .
Dựa trên cấu trúc của CSDL mà Dynamic Data Framework (DDF) sẽ tạo nên các trang web cho
phép người dùng xem/chèn/xóa/sửa dữ liệu.
Nhiều tính linh hoạt cho các DetailsView, FormView, GridView, ListView trong kiểm tra tính
hợp lệ của dữ liệu, hoặc chỉnh sửa lại các mẫu để thay đổi cách hiển thị dữ liệu.
ASP.NET Dynamic Data mang đến cho chúng ta các tiện ích và RAD (Rapid Application
Development) để thay đổi dữ liệu các các control ASP.NET.
t, Detail, Insert, and // Update tasks are performed by using the same page. To enable this mode, uncomment the // following routes and comment out the route definition in the separate-page mode section above. //routes.Add(new DynamicDataRoute("{table}/ListDetails.aspx") { Hình 13 Microsoft Vietnam – DPE Team | Bài số 7: Dynamic Data với LINQ to SQL 8 // Action = PageAction.List, // ViewName = "ListDetails", // Model = model //}); //routes.Add(new DynamicDataRoute("{table}/ListDetails.aspx") { // Action = PageAction.Details, // ViewName = "ListDetails", // Model = model //}); } void Application_Start(object sender, EventArgs e) { RegisterRoutes(RouteTable.Routes); } Chúng ta vào Deburg→StartDebugging (hoặc F5) để chạy thử chương trình. Kết quả khi chạy chương trình (Hình 14). Khi click vào LoaiSanPhams kết quả như hình 15. Khi click vào SanPhams kết quả như hình 16. 2.5 Thêm Custom Metadata vào Model Để thêm tùy biến các mục, chúng ta cần tạo lớp Metadata để nó cung cấp cho hệ thống Dynamic Data thông tin về các thực thể. Đầu tiên bạn cần tạo thêm một lớp partial với cùng tên của lớp entity trong mô hình dữ liệu, sau đó muốn thay đổi thuộc tính lên lớp này phải chỉ ra lớp Metadata cho lớp này. Hình 14 Hình 15 Hình 16 Microsoft Vietnam – DPE Team | Bài số 7: Dynamic Data với LINQ to SQL 9 Trong ví dụ này chúng ta sẽ 2 lớp partial có tên là: LoaiSanPham và SanPham. Để thêm 2 lớp này chúng ta làm như sau: Click chuột phải vào “Add_Code” chọn “Add New Item”, trong hộp thoại “Add New Item”, chọn “Class”, đặt tên cho file là “MyClass.cs”, chọn ngôn ngữ là “Visual C#”, sau đó bấm “Add” (Hình 17). Mở file “MyClass.cs” khai báo thêm các namespace sau: using System.Web.DynamicData; using System.ComponentModel.DataAnnotations; using System.ComponentModel; Thêm 2 lớp partial có tên là: LoaiSanPham, SanPham và tên lớp của MetadataType. [MetadataType(typeof(LoaiSanPham_Metadata))] public partial class LoaiSanPham { public class LoaiSanPham_Metadata { } } [MetadataType(typeof(SanPham_Metadata))] public partial class SanPham { public class SanPham_Metadata { } } Các bảng muốn thay đổi tên hiển thị sử dụng thuộc tính TableName. Khi sử dụng thuộc tính này phải được viết trong thân của lớp partial. Các trường muốn thay đổi tên hiện thị sử dụng thuộc tính DisplayName Các trường muốn có định dạng tùy biến sử dụng thuộc tính DisplayFormat Các trường muốn ẩn khỏi giao diện sửa dụng thuộc tính ScaffoldColumn Các trường muốn kiểu tra tính hợp lệ khi nhập sử dụng thuộc tính Required Khi sử dụng các thuộc tính DisplayName,DisplayFormat,ScaffoldColumn,Required được viết trong thân của lớp MetadataType. Trong ví dụ này sử dụng các thuộc tính TableName, DisplayName để thay đổi giao diện hiện thị cho 2 bảng LoaiSanPham và SanPham. Sử dụng Required để kiểu tra việc nhập dữ liệu cho trường “SoLuong” và “DonGia” của bảng SanPham. using System; using System.Collections.Generic; Hình 17: Thêm file MyClass.cs Microsoft Vietnam – DPE Team | Bài số 7: Dynamic Data với LINQ to SQL 10 using System.Linq; using System.Web; using System.Web.DynamicData; using System.ComponentModel.DataAnnotations; using System.ComponentModel; /// /// Thay đổi cho các thuộc tính cho 2 bảng SanPham và LoaiSanPham /// [MetadataType(typeof(LoaiSanPham_Metadata))] public partial class LoaiSanPham { partial void OnTenLoaiSanPhamChanging(string value) { if (Char.IsLower(value[0]))//Kiểm tự đầu tiên phải có phải là chữ hoa { throw new ValidationException("Tên loại sản phẩm ký tự đầu tiên phải là chữ hoa!"); } } [TableName("Loại sản phẩm")]//Sửa lại tên bảng "LoaiSanPham" thành "Loại sản phẩm" public class LoaiSanPham_Metadata { [DisplayName("Tên loại sản phẩm")]//Sửa lại tên hiển thị cho trường TenLoaiSanPham public object TenLoaiSanPham { get; set; } [DisplayName("Sản phẩm")] public object SanPhams { get; set; } } } [MetadataType(typeof(SanPham_Metadata))] public partial class SanPham { partial void OnTenSanPhamChanging(string value) { if (Char.IsLower(value[0]))//Kiểm tự đầu tiên phải có phải là chữ hoa { throw new ValidationException("Tên sản phẩm ký tự đầu tiên phải là chữ hoa!"); } } [TableName("Sản phẩm")]//Sửa lại tên bảng "SanPham" thành "Sản phẩm" public class SanPham_Metadata { [DisplayName("Tên sản phẩm")]//Sửa lại tên hiển thị cho trường TenLoaiSanPham public object TenSanPham { get; set; } [DisplayName("Số lượng")] [Required] [Range(0, 300)]//Nhập số lượng trong khoảng từ 0 đến 300 public object SoLuong { get; set; } [DisplayName("Đơn giá")] [Required] [Range(100000, 3000000000)]//Nhập đơn giá trong khoảng từ 100.000 đến 3.000.000.000 public object DonGia { get; set; } [DisplayName("Loại sản phẩm")] public object LoaiSanPham1 { get; set; } } } Để sửa lại đổi giao diện của trang Master chúng ta mở file “Site.master”. Ví dụ chúng ta một số nội dung do chương trình tạo ra bằng tiếng Anh và thay bằng tiếng Việt. Sửa: Microsoft Vietnam – DPE Team | Bài số 7: Dynamic Data với LINQ to SQL 11 Dynamic Data Site Thành: Dynamic Data VỚI LINQ to SQL Sửa: <img alt="Back to home page" runat="server" src="DynamicData/Content/Images/back.gif" />Back to home page Thành: <img alt="Trở về trang chủ" runat="server" src="DynamicData/Content/Images/back.gif" />Trở về trang chủ Trong file “Details.aspx” sửa một số giao diện tiếng Anh và thay bằng tiếng Việt. Chi tiết một bản ghi của bảng <asp:DetailsView ID="DetailsView1" runat="server" DataSourceID="DetailsDataSource" OnItemDeleted="DetailsView1_ItemDeleted" CssClass="detailstable" FieldHeaderStyle-CssClass="bold" > <asp:HyperLink ID="EditHyperLink" runat="server" NavigateUrl='' Text="Sửa" /> <asp:LinkButton ID="DeleteLinkButton" runat="server" CommandName="Delete" CausesValidation="false" OnClientClick='return confirm("Bạn có chắc chắn xóa bản ghi này không?");' Text="Xóa" /> Trong file “Edit.aspx” sửa lại <asp:DetailsView ID="DetailsView1" như sau: <asp:DetailsView ID="DetailsView1" runat="server" DataSourceID="DetailsDataSource" DefaultMode="Edit" AutoGenerateEditButton="False" OnItemCommand="DetailsView1_ItemCommand" OnItemUpdated="DetailsView1_ItemUpdated" CssClass="detailstable" FieldHeaderStyle-CssClass="bold"> <asp:Button ID="UpdateLinkButton" runat="server" CommandName="Update" CausesValidation="false" Text="Cập nhật" /> <asp:Button ID="Button1" runat="server" CommandName="Cancel" CausesValidation="false" Text="Hủy bỏ" /> Trong file “Insert.aspx” sửa lại <asp:DetailsView ID="DetailsView1" như sau: <asp:DetailsView ID="DetailsView1" runat="server" DataSourceID="DetailsDataSource" DefaultMode="Insert" AutoGenerateInsertButton="False" OnItemCommand="DetailsView1_ItemCommand" OnItemInserted="DetailsView1_ItemInserted" CssClass="detailstable" FieldHeaderStyle-CssClass="bold"> Microsoft Vietnam – DPE Team | Bài số 7: Dynamic Data với LINQ to SQL 12 <asp:Button ID="Button1" runat="server" CommandName="Cancel" CausesValidation="false" Text="Hủy bỏ" /> Trong file “List.aspx” sửa lại <asp:GridView ID="GridView1" như sau: <asp:GridView ID="GridView1" runat="server" DataSourceID="GridDataSource" AllowPaging="True" AllowSorting="True" CssClass="gridview"> <asp:HyperLink ID="EditHyperLink" runat="server" NavigateUrl='' Text="Sửa" /> <asp:LinkButton ID="DeleteLinkButton" runat="server" CommandName="Delete" CausesValidation="false" Text="Xóa" OnClientClick='return confirm("Bạn có chắc chắn xóa bản nghi này không?");' /> <asp:HyperLink ID="DetailsHyperLink" runat="server" NavigateUrl='' Text="Chi tiết" /> Không có dữ liệu trong bảng! Bây giờ chúng ta chạy thử chương trình. Các giao diện đã được sửa thành tiếng Việt. Chúng ta vào Deburg→StartDebugging (hoặc F5) để chạy thử chương trình. Kết quả khi chạy chương trình file “Defautl.axpx” (Hình 18). Hình 18: Trang chủ của Vi_du_7 Microsoft Vietnam – DPE Team | Bài số 7: Dynamic Data với LINQ to SQL 13 Khi click vào “Loại sản phẩm” kết quả như hình 19 hoặc click vào “Sản phẩm” kết quả như hình 20. 4. Câu hỏi ôn tập 1. Các tính năng của Dynamic Data? Trả lời: Web Scaffolding để tạo ra một ứng dụng web dựa trên các lược đồ cơ bản của cơ sở dữ liệu. Dynamic Data scaffolding có thể tạo ra một chuẩn UI (User Interface – Giao diện người dùng) từ các mô hình dữ liệu. Đầy đủ các thao tác (tạo, cập nhật, xóa bỏ, hiển thị) cho việc truy cập dữ liệu truy cập dữ liệu, các thao tác về quan hệ giữa các bảng và kiểm tra tính hợp lệ của dữ liệu. Tự động hỗ quan các quan hệ khóa ngoài (foreign-key). Dynamic Data phát hiện ra các quan hệ giữa các bảng và từ đó tạo ra các giao diện người dùng trên các bảng quan hệ. Khả năng tùy chỉnh các UI. Khả năng tùy chỉnh tính hợp lệ cho các trường dữ liệu. 2. Dynamic Data hỗ trợ các các mô hình dữ liệu nào? Hình 19: Giao diện của bảng LoaiSanPham Hình 20: Giao diện của bảng SanPham Hình 21: Thêm mới vào bảng SanPham Hình 22: Sửa bản ghi của bản SanPham Microsoft Vietnam – DPE Team | Bài số 7: Dynamic Data với LINQ to SQL 14 Trả lời: Dynamic Data hỗ trợ 2 mô hình dữ liệu LINQ to SQL và ADO.NET Entity Framework. 3. Các bước cơ bản xây dựng Dynamic Data với LINQ to SQL Trả lời: Tạo project Dynamic Data Web Site Xây dựng Cơ sở dữ liệu Tạo DataContext với LINQ to SQL Đăng ký DataContext với file Global.asax Thêm Custom Metadata vào Model 5. Tài liệu tham khảo 1. Using ASP.NET Dynamic Data, URL: 2. Microsoft ASP.NET, URL: 3. ScottGu's Blog, URL: net-dynamic-data-asp-net-ajax-asp-net-mvc-visual-studio-silverlight-wpf.aspx
File đính kèm:
- ASP.NET 3.5 - Bài 7_Dynamic Data với LINQ to SQL.pdf