0

ASP.NET MVC Mẹo # 1 - Tạo mới HTML Helpers với Extension Methods

Trong thủ thuật này, tôi chỉ cho bạn cách bạn có thể tạo ra hai Helpers HTML mới mà bạn có thể sử dụng trong một ASP.NET MVC View. Tôi chỉ cho bạn làm thế nào bạn có thể sử dụng Extension Methods để tạo Helpers HTML mới để hiển thị danh sách gạch đầu dòng và đánh số.

Khi xây dựng một View trong một ứng dụng ASP.NET MVC, bạn có thể tận dụng lợi thế của HTML Helpers để render các thẻ HTML chuẩn. Ví dụ, thay vì gõ này:

<input name="inpSubmit" type="submit" value="Click Here!" /> Bạn có thể gõ: <%= Html.SubmitButton("inpSubmit", "Click Here!") %>

Qua thời gian dài, HTML Helpers có thể giúp bạn tiết kiệm rất nhiều thời gian. Nhưng nếu có không có HTML Helpers cho một thẻ mà bạn muốn render? Ví dụ, hãy tưởng tượng rằng bạn muốn hiển thị một danh sách liệt kê các bản ghi cơ sở dữ liệu trong một View. Các lớp HtmlHelper không bao gồm một hàm cho phép bạn render một danh sách liệt kê. Đừng bỏ cuộc. Nếu HTML Helpers không bao gồm một hàm mà bạn cần, chỉ cần mở rộng nó!

Bạn có thể thêm chức năng mới cho các lớp HtmlHelper bằng cách tạo ra các hàm mở rộng mới. Một hàm mở rộng trông giống như một hàm bình thường. Tuy nhiên, không giống như một hàm bình thường, bạn có thêm các hàm mở rộng tới một lớp bằng cách định nghĩa các phương thức trong một lớp hoàn toàn khác nhau.

Trong Visual Basic .NET, bạn tạo ra phương thức mở rộng bằng cách tạo ra một mô-đun và đặt vào các phương thức mở rộng với một thuộc tính đặc biệt. Trong C #, bạn xác định phương thức mở rộng trong một lớp tĩnh và sử dụng các từ khóa này để chỉ ra các lớp được mở rộng.

Đây là cách bạn có thể thêm các extension methods cho lớp HtmlHelper để hiển thị cả hai đã sắp xếp và không có thứ tự trong danh sách các bản ghi cơ sở dữ liệu:

ListExtensions.vb (VB.NET)

1: Imports System
   2: Imports System.Collections
   3: Imports System.Text
   4: Imports System.Web
   5: Imports System.Web.Mvc
   6: Imports System.Runtime.CompilerServices
   7:  
   8:  
   9: Namespace HtmlHelpers
  10:  
  11:     Public Module ListExtensions
  12:  
  13:         <Extension()> _
  14:         Public Function OrderedList(ByVal HtmlHelper As HtmlHelper, ByVal items As Object) As String
  15:             Return "<ol>" + ListExtensions.GetListItems(items) + "</ol>"
  16:         End Function
  17:  
  18:         <Extension()> _
  19:         Public Function UnorderedList(ByVal HtmlHelper As HtmlHelper, ByVal items As Object) As String
  20:             Return "<ul>" + ListExtensions.GetListItems(items) + "</ul>"
  21:         End Function
  22:  
  23:  
  24:         Private Function GetListItems(ByVal items As Object) As String
  25:             If items Is Nothing Then
  26:                 Throw New ArgumentNullException("items")
  27:             End If
  28:             If Not TypeOf items Is IEnumerable Then
  29:                 Throw New InvalidCastException("items must be IEnumerable")
  30:             End If
  31:  
  32:             Dim EnumItems As IEnumerable = CType(items, IEnumerable)
  33:             Dim builder As New StringBuilder()
  34:             For Each item As Object In EnumItems
  35:                 builder.AppendFormat("<li>{0}</li>", HttpUtility.HtmlEncode(item.ToString()))
  36:             Next
  37:             Return builder.ToString()
  38:         End Function
  39:  
  40:     End Module
  41: End Namespace

ListExtensions.cs (C#)

1: using System;
  2: using System.Collections;
  3: using System.Text;
  4: using System.Web;
  5: using System.Web.Mvc;
  6:  
  7: namespace BulletedListHelper.HtmlHelpers
  8: {
  9:     public static class ListExtensions
 10:     {
 11:         public static string OrderedList(this HtmlHelper helper, Object items)
 12:         {
 13:             return "<ol>" + ListExtensions.GetListItems(items) + "</ol>";
 14:         }
 15:  
 16:         public static string UnorderedList(this HtmlHelper helper, Object items)
 17:         {
 18:             return "<ul>" + ListExtensions.GetListItems(items) + "</ul>";
 19:         }
 20:  
 21:  
 22:         private static string GetListItems(Object items)
 23:         {
 24:             if (items == null)
 25:                 throw new ArgumentNullException("items");
 26:             if (items is IEnumerable == false)
 27:                 throw new InvalidCastException("items must be IEnumerable");
 28:  
 29:             var enumItems = (IEnumerable)items;
 30:             var builder = new StringBuilder();
 31:             foreach (Object item in enumItems)
 32:                 builder.AppendFormat("<li>{0}</li>", HttpUtility.HtmlEncode(item.ToString()));
 33:             return builder.ToString();
 34:         }
 35:  
 36:     }
 37: }

Lớp ListExtensions có hai phương thức công khai: OrderedList () và UnorderedList (). Bạn vượt qua các items cho một trong hai phương thức để hiển thị trong danh sách có đánh số hoặc gạch đầu dòng các mặt hàng. Chú ý rằng các phương thức trả lại chuỗi. Thực sự, HTML Helper là gì khác hơn là một phương thức format một chuỗi định dạng trên trình duyệt.

Sau khi bạn tạo ra các phương thức mở rộng, bạn có thể sử dụng các phương thức trong một View như thế này: Index.aspx

1: <%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="false" CodeBehind="Index.aspx.vb" Inherits="BulletedListHelper.Index" %>
2: <%@ Import Namespace="BulletedListHelper.HtmlHelpers" %>
3:  
4: <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
5:   
6:  
7:    <h1>Movies (Ordered)</h1>
8:  
9:    <%= Html.OrderedList(ViewData.Model) %>
10:  
11:  
12:    <h1>Movies (Unordered)</h1>
13:  
14:  
15:    <%= Html.UnorderedList(ViewData.Model) %>
16:  
17:  
18: </asp:Content>

Chú ý rằng BulletedList.HtmlHelpers namespace được nhập ở đầu tập tin. Phương thức Html.OrderedList () được sử dụng để render cho danh sách số và phương thức Html.UnorderedList () được sử dụng để render một danh sách liệt kê. Chú ý rằng các phương thức này đang được gọi trên HtmlHelper xuất ra thuộc tính Html của View giống như bất kỳ phương thức nào khác. Khi bạn mở View này trong một trình duyệt, bạn sẽ có được các trang trong Hình 1:

Hình 1 - index.aspx rendered với Custom HTML Helpers

alt

Cuối cùng, Index() trong HomeController của List 3 cho thấy làm thế nào bạn có thể truyền một tập các bản ghi phim vào index.aspx View. Các phim được lấy bằng LINQ to SQL.

Listing 3 – HomeController.vb (VB.NET)

1: Public Class HomeController
 2:     Inherits System.Web.Mvc.Controller
 3:  
 4:     Private db As New MoviesDataContext()
 5:  
 6:     Function Index()
 7:         Dim movies = From m In db.Movies Select m.Title
 8:         Return View(movies)
 9:     End Function
10:  
11:    
12: End Class

HomeController.cs (C #)

using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Web;
   5: using System.Web.Mvc;
   6: using BulletedListHelper.Models;
   7:  
   8: namespace BulletedListHelper.Controllers
   9: {
  10:     public class HomeController : Controller
  11:     {
  12:  
  13:         private MoviesDataContext db = new MoviesDataContext();  
  14:  
  15:         public ActionResult Index()
  16:         {
  17:             var movies = from m in db.Movies select m.Title;
  18:             return View(movies);
  19:         }
  20:  
  21:     }
  22: }

Bạn có thể sử dụng phương thức này để render về bất cứ điều gì trong ASP.NET MVC View. Ví dụ, bạn có thể sử dụng một cách tiếp cận tương tự để tạo ra TreeViews, Menus, tabstrips, bất cứ điều gì.

Click Here to Download the Source Code

Nguồn: https://weblogs.asp.net/stephenwalther/asp-net-mvc-tip-1-creating-new-html-helpers-with-extension-methods


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.