Những điểm mới ở ASP.NET MVC 3

ASP.Net MVC 3 là một phiên bản khá hấp dẫn, có thêm nhiều tính năng và cải tiến mới rất tuyệt vời, giúp đơn giản hóa mã (code) của bạn. ASP.Net MVC 3 cũng tương thích ngược với ASP.Net MVC 1 và ASP.Net MVC 2, khiến việc nâng cấp các ứng dụng hiện có rất dễ dàng. Bài viết này sẽ trình bày về những tính năng mới như: Razor, multi view engine, những cài tiến trong: controller, JavaScript và Ajax, Model Validation, Dependency Injection, và các tính năng mới khác.

1. Công cụ xem Razor (The Razor View Engine)

– ASP.net MVC 3 đi kèm với một công cụ xem mới có tên là Razor với những lợi ích sau:

  • Cú pháp Razor là sạch sẽ và xúc tích, đòi hỏi một số lượng tối thiểu các tổ hợp phím.
  • Việc tìm hiểu Razor tương đối dễ dàng vì nó dựa trên ngôn ngữ C# và Visual Basic.
  • Visual Studio bao gồm IntelliSense và mã cú pháp Razor được màu hóa.
  • Razor views có thể kiểm tra từng đơn vị mà không đòi hỏi bạn phải chạy các ứng dụng hoặc phải chạy web server.

– Một số tính năng mới của Razor:

  • Cú pháp @model để xác định các loại sẽ được truyền vào view.
  • @**@  là cú pháp comment.
  • Khả năng định rõ mặc định (như layoutpage) một lần cho toàn bộ trang web.
  • Phương thức Html.Raw để hiển thị các văn bản mà không cần mã hóa Html cho nó.
  • Hỗ trợ chia sẽ mã giữa nhiều views (_viewstart.cshtml hay _viewstart.vbhtml).

–  Razor cũng bao gồm những công cụ hỗ trợ HTML mới, chẳng hạn như:

  • Chart – biểu diễn một biểu đồ, cung cấp các tính năng như control chart trong ÁP.NET 4.
  • WebGrid – biểu diễn một lưới dữ liệu (data grid), hoàn chỉnh với chức năng phần trang và phân loại.
  • Crypto – Sử dụng các thuật toán băm (hashing algorithms) để tạo thuộc tính thông thạo và băm các mật khẩu.
  • WebImage – biểu diễn một hình ảnh.
  • WebMail – gởi tin nhắn email.

–  Để biết thêm các  thông tin về Razor, xem thêm các nguồn sau:

2. Hỗ trợ đa View Engines (Support for Multiple View Engines)

–  Thêm hộp thoại View trong ASP.NET MVC 3 cho phép bạn chọn các view engine mà bạn muốn làm việc với nó, và hộp thoại New Project cho phép bạn xác định view engine mặc định cho một project. Bạn có thể chọn view engine Web Forms (ASPX), Razor, hay một view engine nguồn mở như Spark, NHaml, hay NDjango.

3. Những cải tiến Controller

3.1 Global Action Filters

Đôi khi bạn muốn thực hiện một logic hoặc trước khi một phương thức thực hiện hoặc sau một một phương thức hành động được thực hiện. Để hỗ trợ điều này, ASP.NET MVC 2 đã cung cấp bộ lọc hành động (Action Filters).  Action Filter là các thuộc tính tùy chỉnh cung cấp khai báo một phương tiện để thêm trước hành động và sau hành động một hành vi để xác định phương thức controller hành động cụ thể. MVC 3 cho phép bnaj chỉ định các bộ lọc chung bằng cách thêm chúng vào bộ sưu tập GlobalFilters. Để biết thêm thông tin có thể tham khảo ở những nguồn dưới đây:

3.2 Thuộc tính mới “ViewBag”

MVC 2 hỗ trợ điều điều khiển một thuộc tính ViewData để cho phép bạn chuyển dữ liệu đến một view template bằng cách sử dụng một API. Trong MVC 3, bạn có thể sử dụng cú pháp đơn giản hơn một chút với thuộc tính ViewBag để thwucj hiện cùng một mục đích trên. Ví dụ, thay vì viết ViewData[“Message”] = “text”, bạn có thể viết ViewBag.Message = “text”. Bạn không cần phải xác định lớp mạnh bất kỳ để sử dụng thuộc tính ViewBag. Bởi vì nó là một thuộc tính năng động (dynamic property), bạn có thể thay vì chỉ nhận hay thiết lập các thuộc tính và nó sẽ giải quyết các ván đề còn lại tự động khi chạy. Bên trong thuộc tính ViewBag được lưu trữ như cặp name/value trong từ điển ViewData. (Lưu ý: trong hầu hết các phiên bản trước của MVC3, thuộc tính ViewBag có tên là ViewModel).

3.3 Các kiểu “ActionResult” mới

Dưới đây là các kiểu ActionResult và phương pháp trợ giúp mới và nâng cao trong MVC 3:

  • HttpNotFoundResult . Trả về trạng thái mã HTTP 404 cho khách hàng.
  • RedirectResult . Trả về một chuyển hướng tạm thời (mã trạng thái HTTP 302) hoặc một chuyển hướng vĩnh viễn (mã trạng thái HTTP 301), phụ thuộc vào một tham số Boolean.
  • HttpStatusCodeResult . Trả về một mã trạng thái người dùng được xác định.

4. JavaScript và Ajax

Theo mặc định, Ajax và các công cụ hỗ trợ hợp lệ trong MVC 3 sử dụng một cách tiếp cận unobtrusive JavaScript. Unobtrusive JavaScript nội tuyến tránh tiêm tín hiệu từ JavaScript vào HTML. Điều này làm cho HTML của bạn nhỏ hơn và ít lộn xộn hơn, và làm cho nó chuyển đổi ra ngoài dễ dàng hơn hay tùy chỉnh các thư viện JavaScript. Validation helpers trong MVC 3  cũng sử dụng plugin jQueryValidate theo mặc định. Nếu bạn muốn MVC 2 thực hiện, bạn có thể vô hiệu hóa unobtrusive JavaScript bawgnf cách thiết lập lại file web.config.  Để biết thêm thông tin về Ajax và JavaScript tham khảo những nguồn sau:

4.1 Client-Side Validation Enabled by Default

–  Trong các phiên bản trước đó của MVC, bạn cần phải gọi rõ phương thức Html.EnableClientValidation từ một view để cho phép phía máy khác xác nhận. Điều này trong MVC 3 là không cần thiết vì phía khách hàng xác nhận là kích hoạt mặc định. (Bạn có thể vô hiệu hóa điều này bằng cách sử dụng một thiết lập trong file web.config).

–  Để cho phía máy khách xác nhận để làm việc, bạn vẫn cần phải tham khảo thích hợp  thư viện jQuery và jQuery Validation trong trang web của bạn. Bạn có thể lưu trữ các thư viện trên máy chủ của chính bạn hoặc tham chiếu cho chúng từ một mạng lưới phân bố nội dung(CDN – Content Delivery Network) như CDNs từ Microsoft hay Google.

4.2  Remote Validator

–  ASP.NET MVC 3 hỗ trợ lớp RemoteAttribute cho phép bạn tận dụng lợi thể của plugin jQuery Validation để hỗ trợ xác nhận từ xa. Điều này cho phép các bên các nhận thư viện client-side validation để tự động gọi một phương thức tùy chỉnh mà bạn xác định trên máy chủ để thực hiện xác nhận logic chỉ có thể được xác nhận phía máy chủ.

–  Trong ví dụ sau đây, thuộc tính Remote xác định rừng xác nhận máy khác sẽ gọi một hành động tên là UserNameAvailable trên lớp UsersController để xác minh trường UserName.

public class User {
    [Remote("UserNameAvailable", "Users")]
    public string UserName { get; set; }
}

– Ví dụ sau đây minh họa các điều khiển tương ứng:

public class UsersController {
    public bool UserNameAvailable(string username)
    {
        if(MyRepository.UserNameExists(username))
        {
            return "false";
        }
        return "true";
    }
}

– Để biết thêm về cách sử dụng các thuộc tính Remote, xem bài How to: Implement Remote Validation in ASP.NET MVC trong MSDN.

4.3 JSON Binding Support

ASP.NET MVC 3 bao gồm ràng buộc hỗ trợ JSON cho phép các phương thức hành động để nhận được dữ liệu JSON-encoded và model-bind tham số phương thức hành động của nó. Khả năng này rất hữu ích trong các tình huống liên quan đên client template và data binding. MVC 3 cho phép bạn dễ dàng kết nối client template với các phương thức hành độngtrên máy chủ khi gởi và nhận nhận dữ liệu JSON. Để biết thêm thông tin về JSON binding support, tham khảo Scott Guthrie’s MVC 3 Preview .

5. Model Validation Imporvements

5.1 Thuộc tính siêu dữ liệu “DataAnnotations”

ASP.NET MVC 3 hỗ trợ các thuộc tính siêu dữ liệu DataAnnotations như DisplayAttribute.

5.2 Lớp “ValidationAttribue”

Lớp ValidationAttribute đã được cải tiến trong .NET Framerwork 4 để hỗ trợ một quá tải mới là IsValid cung cấp thêm thông tin về bối cảnh xác nhận hiện tại, chẳng hạn như những gì đối tượng đang được xác nhận. Điều này cho phép các kịch bản phong phú hơn, nơ bạn có thể xác nhận giá trị hiện tại dựa trên các thuộc tính khác của model. Ví dụ, thuộc tính mới CompareAttribute cho phép bạn so sánh các giá trị của 2 thuộc tính của một model. Trong ví dụ dưới đây, thuộc tính ComparePassword phải phù hợp với trường Password để được hợp lệ:

public class User {
    [Required]
    public string Password { get; set; }
    [Required, Compare("Password")]
    public string ComparePassword { get; set; }
}

5.3 Validation Interfaces

– Giao diện IValidatableObject cho phép bạn thực hiện các cấp model xác nhận, và nó cho phép bạn cung cấp các thông điệp xác nhận lỗi cụ thể đối với các trạng thái của model tổng thể, hay giữ 2 thuộc tính trong model. MVC 3 bây giờ lấy lỗi từ giao diện IValidatableObject khi ràng buộc mô hình, và từ động gắn cờ hay tô sáng các trường bị ảnh hưởng trong phậm vi view bằng cách sử dụng công cụ hỗ trợ hình thức HTML.

– Giao diện IClientValidatable cho phép ASP.NET MVC khám phá trong thời gian chạy dù validator đã hỗ trợ cho việc xác thực ở client. Giao diện này được thiết kế để có thể tích hợp với hàng loạt các validation frameworks.

6. Dependency Injection Imporvements

–  ASP.NET MVC 3 cung cấp hỗ trợ tốt hơn cho việc áp dụng Dependency Injection (DI) và tích hợp với Dependency Injection hay Inversion of Control (IOC) containers. Các hỗ trợ cho DI được thêm vào:

    • Controllers (registering and injecting controller factories, injecting controllers).
    • Views (registering and injecting view engines, injecting dependencies into view pages).
    • Action filters (locating and injecting filters).
    • Model binders (registering and injecting).
    • Model validation providers (registering and injecting).
    • Model metadata providers (registering and injecting).
    • Value providers (registering and injecting).

–  MVC 3 hỗ trợ các thư viện Common Service Locator và bất kỳ DI container nào có hỗ trợ của thư viện IServiceLocator. Nó cũng hỗ trợ giao diện mới IDpendencyResolver làm cho nó dễ dàng hơn để tích hợp với DI frameworks.

–  Tham khảo thêm:

7. Các tính năng mới khác (Other New Features)

7.1 NuGet Integration

–  ASP.NET MVC 3 tự động cài đặt và cho phép Nuget như một phần cài đặt của nó. NuGet là một gói quản lý nguồn mở miễn phí mà có thể dễ dàng tìm tâấy nó, cài đặt và sử dụng  thư viện .NET và các công cụ trong các project của bạn. Nó hoạt động với tất cả các loại project của Visual Studio (bao gồm ASP.NET Web Forms và ASP.NET MVC).

–  NuGet cho phép các nhà phát triển để duy trì các dự án mã nguồn mở (ví dụ: các dự án như Moq, NHibernate, Ninject, StructureMap, NUnit, Windsor, RhinoMocks, và Elmah) để đóng gói thư viện của mình và đăng ký chúng trong một bộ sưu tập trực tuyến.

–  Để biết thêm về NuGet, xem thêm tài liệu NuGet documentation on the CodePlex site

7.2 Partial-Page Output Caching

ASP.NET MVC được hỗ trợ bộ nhớ đệm output của trang trả lời đầy đủ kể từ phiên bản 1. MVC 3 cũng hỗ trợ các trang xuất caching một phần, cho phép bạn dễ dàng đến các vùng nhớ đệm hoặc các mảnh của một response.

7.3 Kiểm soát và yêu cầu xác nhận (Granular Control over Request Valiedation)

ASP.NET MVC đã được xây dựng trong quá trình xác nhận yêu cầu tự động giúp bảo vệ chống lại các cuộc tấn công XSS và HTML injection. Tuy nhiên, đôi khi bạn muốn vô hiệu hóa yêu cầu xác nhận rõ ràng, chẳng hạn như nếu bạn muốn cho phép một người post nội dung HTML (Ví dụ, trong ác mục blog hoặc nội dung CMS). Bạn có thể thêm một thuộc tính AllowHtml cho các model hay view models để vô hiệu hóa các yêu cầu xác nhận trên mỗi một thuộc tính cơ bản trong mô hình liên kết.

7.4 Mở rộng hộp thoại “New Project”

Trong ASP.NET MVC 3, bạn có thể thêm các project mẫu, view engines, và unit test project frameworks cho hộp thoại  New project.

7.5 Scaffolding Improvements

ASP.net MVC 3 các mẫu scaffolding làm một công việc tốt hơn của việc xác định các thuộc tính khóa chính trên các mô hình và xử lý chúng một cách thích hợp hơn trong các phiên bản trước của MVC.

Theo mặc định, Tạo và Sửa scaffolds bây giờ sử dụng Html.EditorFor helper thay vì Html.TextBoxFor helper. Điều này cải thiện hỗ trợ cho các siêu dữ liệu trên mô hình ở dạng chú thích thuộc tính dữ liệu khi hộp thoại Add View tạo ra một view.

7.6 Các quá tải mới cho “Html.LabelFor”” và “Html.LabelForModel”

Các phương pháp quá tải mới có thêm  phương thức LabelFor và LabelForModel. Các quá tải mới cho phép bạn xác định hay ghi đè lên label text.

7.7 Sessioinless Controller Support

7.8 Lớp mới “AdditionalMetadataAttribute”

–   Bạn có thể sử dụng thuộc tính AdditionalMetadata để đưa vào từ điển ModelMetadata. AdditionalValues cho một thuộc tính model. Ví dụ, nếu view model có một thuộc tính sẽ được hiển thị chỉ cho một admin, bạn có thể thực hiện giống như trong ví dụ dưới đây:

public class ProductViewModel {
    [AdditionalMetadata("AdminOnly", true)]
    public string RefundCode {get; set;}
}