ASP.NET MVC Mẹo # 1 - Tạo mới HTML Helpers với Extension Methods
Bài đăng này đã không được cập nhật trong 7 năm
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
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ì.
All rights reserved