1. Trang chủ
  2. » Công Nghệ Thông Tin

21 chuong 21

37 36 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 37
Dung lượng 1,1 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Giống như một ví dụ đơn giản, trong Listing 21-4 bạn có thể thấy cách mà tôi đã chuyển sang từ chỉ viết ngoài giá trị sử dụng HTML các phần tử danh sách không thể đếm xuể.. Tạo một phươ

Trang 1

Table 21-1 Bản tóm tắt chương

Chuẩn bị dự án nghiên cứu

Dành cho chương này, tôi đã tạo một dự án MVC Visual Studio mới HelperMethods có tên gọi sử dụng Template Empty, kiểm tra tùy chọn thêm các thư mục và tham chiếu MVC cốt lõi Tôi đã thêm một người kiểm soát Home, mà bạn có thể thấy được Listing 21-1

Listing 21-1 Nội dung HomeController.cs File

using System.Web.Mvc;

namespace HelperMethods.Controllers {

public class HomeController : Controller {

public ActionResult Index() {

ViewBag.Fruits = new string[] {"Apple", "Orange", "Pear"};

ViewBag.Cities = new string[] { "New York", "London", "Paris"

Trang 2

2

Bạn có thể thấy nội dung File xem trong Listing 21-2 Điều này là một xem định kiểu mạnh mẽ (nơi mà kiểu

mô hình là chuỗi) và tôi đã không sử dụng một cách bố trí

Listing 21-2 Nội dung Index.cshtml File

Thiết lập Start URL

Tôi muốn Visual Studio khởi động với URL gốc dành cho ứng dụng thay vì đoán URL đã dựa trên File mà đang được chỉnh sửa HelperMethods Properties được lựa chọn từ menu Project Visual Studio, chuyển sang đến Web tab và kiểm tra tùy chọn Page Specific trong phần Action Start Bạn không có cung cấp một giá trị Chỉ kiểm tra tùy chọn là đủ

Kiểm tra ứng dụng ví dụ

Bạn có thể thấy cách mà xem được trả bởi khởi động ứng dụng Cấu hình gửi mặc định đã thêm đến dự án bằng Visual Studio sẽ ánh xạ URL gốc đã yêu cầu tự động bằng browser đến hành động Index trên người kiểm soát Home, giống như minh họa trong 21-1 hình

Trang 3

3

Tạo các phương thức trợ giúp tùy chỉnh

Tôi sẽ theo mô hình tôi đã thiết lập trên một vài chương sau cùng và giới thiệu bạn đến phương thức trợ giúp bằng tạo thực thi tùy chỉnh riêng của tôi Trong phần mà theo, tôi sẽ cho thấy bạn hai kỹ thuật khác dành cho tạo các phương thức trợ giúp tùy chỉnh

Tạo một phương thức trợ giúp Inline

loại phương thức trợ giúp đơn giản nhất là một người giúp đỡ nội dòng, mà được định nghĩa trong một xem Tôi có thể tạo một người giúp đỡ nội dòng đơn giản hoá xem ví dụ sử dụng thẻ @helper, giống như minh họa trong Listing 21-3

Listing 21-3 Tạo một phương thức trợ giúp Inline trong Index.cshtml File

Trang 4

TIP: hú ý điều đó tôi là không có gán các thuộc tính động từ ViewBag treo mảng khi (việc) sử dụng người

giúp đỡ nội dòng Một trong những đẹp các tính năng loại phương thức trợ giúp này là rằng nó là hạnh phúc đánh giá kiểu tại runtime

phần thân một người giúp đỡ nội dòng theo cú pháp như thế giống như phần còn lại một xem Razor Các chuỗi nghĩa đen được đánh giá giống như HTML tĩnh, và câu lệnh mà đòi hỏi (sự) chế biến bằng Razor được bắt đầu với ký tự @ Người giúp đỡ trong ví dụ trộn HTML tĩnh và các thẻ Razor liệt kê mục trong mảng, mà (nó) tạo ra đầu ra như thế giống như (sự) xem gốc nhưng đã giảm lượng sao lại trong (sự) xem Lợi ích cách tiếp cận này là rằng tôi chỉ có làm một thay đổi nếu tôi muốn thay đổi cách mà các nội dung mảng được hiển thị Giống như một ví dụ đơn giản, trong Listing 21-4 bạn có thể thấy cách mà tôi đã

chuyển sang từ chỉ viết ngoài giá trị sử dụng HTML các phần tử danh sách không thể đếm xuể

Listing 21-4 Thay đổi Contents một phương thức trợ giúp trong Index.cshtml File

Tôi chỉ có làm thay đổi trong một vị trí, mà có thể có vẻ như một lợi thế vặt vãnh trong như một dự án đơn giản, nhưng điều này có thể là một chiều hữu ích giữ việc xem của bạn đơn giản và nhất quán trong một dự

án thật sự Bạn có thể thấy kết quả thay đổi này trong Figure 21-2

Trang 5

5

Figure 21-2 Thay đổi đánh dấu trong một phương thức trợ giúp

TIP: chú ý điều đó tôi đã có bắt đầu từ khóa foreach với @ trong ví dụ này nhưng không trong Listing 21-4

Điều này là vì phần tử đầu tiên trong phần thân người giúp đỡ đã thay đổi trở thành một phần tử HTML, mà

có nghĩa tôi có sử dụng @ nói Razor điều đó tôi đang sử dụng một

Câu lệnh C# Trong ví dụ trước đó là không phần tử HTML, vì vậy Razor đã giả định nội dung đã là mã Nó

có thể là khó theo dõi những thói quen này, nhưng Visual Studio sẽ đánh dấu lên lỗi như điều này dành cho bạn

Tạo một phương thức trợ giúp External

Các người giúp đỡ nội dòng là thuận lợi, nhưng họ có thể là sử dụng chỉ từ xem trong đó họ được khai báo

và, nếu họ là quá phức tạp, họ có thể lấy trên xem đó và làm nó khó đến việc đọc

Thay thế là đến tạo một phương thức trợ giúp HTML ngoài, mà được trình bày giống như một phương thức

mở rộng C# Các phương thức trợ giúp ngoài có thể là sử dụng thêm phổ biến, nhưng là một ít thêm gây bối rối viết, vì C# không tự nhiên xử lý thế hệ phần tử HTML thanh lịch Chứng minh tính năng này, tôi đã thêm một thư mục Infrastructure đến dự án ví dụ và tạo một File lớp CustomHelpers.cs mới trong nó Bạn

có thể thấy nội dung File này trong Listing 21-5

Listing 21-5 Nội dung CustomHelpers.cs File

Trang 6

6

Phương thức trợ giúp tôi đã tạo thực hiện hàm như thế giống như người giúp đỡ nội dòng trong ví dụ trước

Nó lấy một mảng chuỗi và tạo ra một phần tử ul HTML, chứa một phần tử li dành cho mỗi chuỗi trong mảng

Tham số đầu tiên đến phương thức trợ giúp là một đối tượng HtmlHelper, bắt đầu với từ khóa này nói trình biên dịch C# điều đó tôi đang định nghĩa một phương thức mở rộng HtmlHelper cung cấp truy xuất đến thông tin mà có thể là hữu ích khi tạo nội dung, qua thuộc tính đã mô tả trong bảng 21-2

Table 21-2 Các tài sản hữu ích đã định nghĩa bởi HtmlHelper Class

Thuộc tính ViewContext là hầu hết hữu ích khi bạn muốn tạo nội dung mà (nó) điều chỉnh đến yêu cầu được

xử lý Trong bảng 21-3, tôi đã mô tả một vài của hầu hết sử dụng (một cách) thông thường thuộc tính đã định nghĩa bởi lớp ViewContext

Table 21-3 Các tài sản hữu ích đã định nghĩa bởi ViewContext Class

Thông tin bạn có thể nhận về yêu cầu là toàn diện khá, nhưng hầu hết phương thức trợ giúp là đơn giản và được dùng để giữ định dạng nhất quán Bạn có thể sử dụng các phương thức trợ giúp tích hợp dành cho tạo

ra nội dung cụ thể requests (tôi mô tả những người giúp đỡ này sau đó trong chương) và bạn có thể sử dụng xem hoặc các hành động con riêng phần dành cho thêm các tác vụ phức tạp (tôi cung cấp hướng dẫn về cách tiếp cận sử dụng trong phần chương này tiếp theo)

Trang 7

Tôi tạo một instance TagBuilder mới, trôi qua trong đặt tên phần tử HTML tôi muốn xây dựng giống như tham số phương thức tạo Tôi là không cần sử dụng dấu ngoặc góc ( >và >) với lớp TagBuilder, mà có nghĩa tôi có thể tạo một phần tử ul, như thế này:

Các thành viên lớp TagBuilder hữu ích nhất được mô tả trong bảng 21-4

Table 21-4 Một vài thành viên TagBuilder Class

Kết quả một phương thức trợ giúp HTML là một đối tượng MvcHtmlString, nội dung của mà được viết trực tiếp trong phản ứng đến trình khách Dành cho người giúp đỡ ví dụ, tôi truyền kết quả phương thức

TagBuilder.ToString đến phương thức tạo một đối tượng MvcHtmlString mới, như điều này:

Câu lệnh này tạo ra đoạn HTML mà chứa ul và các phần tử li và trả về chúng đến bộ máy xem vì vậy điều

đó nó có thể được chèn trong phản ứng

Sử dụng một phương thức trợ giúp External Custom

Sử dụng một phương thức trợ giúp ngoài tùy chỉnh là một ít khác sử dụng một nội dòng một Trong listing 21-6, bạn có thể thấy thay đổi tôi đã làm đến /Views/Home/Index.cshtml thay thế người giúp đỡ nội dòng với (thuộc) ngoài một

Listing 21-6 Sử dụng một phương thức trợ giúp External Custom trong Index.cshtml File

Trang 8

8

Tôi cần bảo đảm rằng namespace mà chứa phương thức mở rộng người giúp đỡ là trong phạm vi Tôi đã làm điều này sử dụng một thẻ @using, nhưng nếu bạn đang phát triển rất nhiều các người giúp đỡ tùy chỉnh khi đó bạn sẽ muốn thêm namespace mà chứa chúng đến /Views/Web.config file vì vậy điều đó họ là luôn sẵn có trong việc xem của bạn

Tôi tham chiếu đến người giúp đỡ sử dụng @Html.<helper>, nơi mà <helper> là tên phương thức mở rộng Trong trường hợp này, tôi sử dụng @Html.ListArrayItems Phần Html biểu thức này tham chiếu đến một thuộc tính đã định nghĩa bởi lớp cơ sở xem, mà trả về một đối tượng HtmlHelper, mà là kiểu đến mà tôi đã

áp dụng phương thức mở rộng trong Listing 21-5

Tôi truyền dữ liệu đến phương thức trợ giúp giống như tôi sẽ dành cho một người giúp đỡ nội dòng hoặc một phương thức C#, mặc dù tôi phải quan tâm đến gán từ các thuộc tính đối tượng ViewBag động đến kiểu

đã định nghĩa bởi người giúp đỡ ngoài (trong điều này trường hợp một mảng chuỗi) Cú pháp này là không giống như hấp dẫn giống như sử dụng các người giúp đỡ nội dòng, nhưng nó một phẩn của giá điều đó bạn phải trả tiền tạo một người giúp đỡ mà có thể được sử dụng trong bất kỳ xem trong dự án của bạn

Biết cách khi nào sử dụng phương thức trợ giúp

Bây giờ điều đó bạn đã thấy cách mà phương thức trợ giúp làm việc, bạn có thể là tự hỏi khi bạn nên sử dụng chúng trong ưu tiên đến xem hoặc các hành động con riêng phần, nhất là giống như có chồng lên giữa cái gì những tính năng này là có khả năng của

Tôi chỉ sử dụng phương thức trợ giúp giảm lượng sao lại trong xem, chỉ giống như tôi làm trong ví dụ này,

và chỉ dành cho đơn giản nhất của nội dung Dành cho thêm khu liên hợp đánh dấu và nội dung tôi sử dụng

Trang 9

9

xem riêng phần và tôi sử dụng một hành động con khi tôi cần thực hiện bất kỳ thao tác dữ liệu mô hình Tôi

đề nghị rằng bạn theo vật tương tự tiếp cận và giữ của bạn sử dụng phương thức trợ giúp giống như đơn giản giống như có thể (nếu người giúp đỡ của tôi chứa hơn một nhúm các câu lệnh C# — hoặc thêm các câu lệnh C# mà các phần tử HTML — khi đó tôi có xu hướng chuyển sang đến một hành động con.)

Quản lý chuỗi mã hoá trong một phương thức trợ giúp

MVC Framework làm một nổ lực bảo vệ bạn từ dữ liệu độc hại bằng mã hoá tự động nó vì vậy điều đó nó

có thể được thêm đến một trang HTML an toàn Bạn có thể thấy một ví dụ của điều này trong người kiểm soát Home trong ứng dụng ví dụ nơi mà tôi truyền một tiềm năng 559 chuỗi quấy rầy đến xem giống như đối tượng mô hình, giống như minh họa trong Listing 21-7

Listing 21-7 Nội dung HomeController.cs File

Đối tượng mô hình chứa một phần tử HTML hợp lệ, nhưng khi giá trị được trả bởi Razor, HTML theo được tạo ra:

Điều này là một phòng ngừa bảo mật cơ bản mà ngăn chặn các giá trị dữ liệu từ được thông dịch giống như hợp lệ đánh dấu bằng browser Điều này là cơ sở dành cho một form đòn tấn công thông dụng trong đó các người dùng độc hại sẽ cố gắng đến ngầm phá hoại hành vi một ứng dụng bằng cố gắng thêm HTML riêng của chúng đánh dấu hoặc mã JavaScript Dao cạo mã hoá các giá trị dữ liệu tự động khi họ được sử dụng trong một xem, nhưng phương thức trợ giúp cần là có khả năng tạo ra HTML Giống như một hậu quả, họ được cung cấp một cấp độ tin cậy cao hơn bằng bộ máy xem, và điều này có thể đòi hỏi một vài chú ý cẩn thận

Tìm hiểu vấn đề

Chứng minh vấn đề, tôi đã tạo một phương thức trợ giúp mới trong lớp Custom Helpers, giống như minh họa trong Listing 21-8 Người giúp đỡ này lấy một chuỗi giống như một tham số và tạo ra HTML như thế điều đó tôi đã bao gồm trong việc xem Index

Trang 10

10

Listing 21-8 Định nghĩa một phương thức trợ giúp New trong CustomHelpers.cs File

Tôi sử dụng phương thức String.Format tạo ra HTML đánh dấu và truyền kết quả giống như đối số đến phương thức tạo MvcHtmlString Trong listing 21-9, bạn có thể thấy cách mà tôi đã thay đổi

/View/Home/Index.cshtml sử dụng phương thức trợ giúp mới (tôi cũng làm một vài thay đổi nhấn mạnh nội dung mà đến từ phương thức trợ giúp.)

Listing 21-9 Sử dụng phương thức trợ giúp DisplayMessage trong Index.cshtml File

Trang 11

11

Bạn có thể thấy hiệu quả phương thức trợ giúp mới có bằng khởi động ứng dụng, giống như minh họa trong hình 21-3

Hình 21-3.So sánh dữ liệu giá trị được mã hóa như thế nào

Các trình hỗ trợ là đáng tin cậy để tạo ra nội dung an toàn, đó là đáng tiếc vì nó dẫn đến trình duyệt Hiển thị một

Trang 12

12

yếu tố đầu vào, mà là loại hành vi có thể được khai thác để loại bỏ ứngdụng

Mã hóa nội dung trình hỗ trợ

Có một vài cách khác nhau để giải quyết vấn đề này và sự lựa chọn giữa họ phụ thuộc vào bản chất của nội dung của trình hỗ trợ sản xuất Giải pháp đơn giản nhất là để thay đổi loại trình hỗ trợ, trở về chuỗi, như được hiển thị trong Listing 21-10 Điều này cảnh báo động xem nội dung của bạn không phải là an toàn và phải được mã hoá trước khi nó được đưa vào chế độ xem

using System.Web.Mvc; using

System;

namespace HelperMethods.Infrastructure { public static class

CustomHelpers {

public static MvcHtmlString ListArrayItems(this HtmlHelper html, string[] list) {

TagBuilder tag = new TagBuilder("ul"); foreach(string str in list) { TagBuilder itemTag = new TagBuilder("li"); itemTag.SetInnerText(str);

Trang 13

return String.Format("This is the message: <p>{0}</p>", msg);

Kỹ thuật này làm cho Razor mã hoá toàn bộ nội dung là gửi trả bằng trình hỗ trợ, là vấn đề khi bạn đang tạo ra phần tử HTML ( khi Tôi ở trình hỗ trợ ví dụ ), nhưng là tiện lợi mặt khác Bạn thấy được thay đổi trong Hình 21-4

Hình 21-4 Đảm bảo rằng động cơ góc nhìn mã hoá đáp ứng từ trình hỗ trợ

Tôi đã giải quyết vấn đề với phần tử đầu vào, nhưng phần tử p của tôi đã được mã hoá tương tự, mà không là điều Tôi cần

Trong tình huống này, Tôi cần chọn lọc hơn và mã hoá giá trị dữ liệu chỉ, như đã nêu trong Listing 21-11

Listing 21-11 Chọn lọc Mã hóa Giá trị Dữ liệu trong tập tin CustomHelpers.cs

msg) {

string encodedMessage = html.Encode(msg);

string result = String.Format("This is the message: <p>{0}</p>",

Trang 15

15

Hình 21-5 Hiệu ứng của chọn lọc mã hóa nội dung trong trình hỗ trợ ngoài

Sử dụng trình hỗ trợ form nội tại

Mô hình MVC bao gồm lựa chọn của phương pháp trình hỗ trợ nội tại giúp bạn quản lý tạo ra của phần tử định dạng HTML Ở phần sau đây, Tôi sẽ đặt trình hỗ trợ này trong ngữ cảnh và cho bạn thấy cách làm như thế nào chúng được sử dụng

Tạo phần tử form

Một trong những dạng của tương tác phổ biến nhất trong ứng dụng web là định dạng HTML, là đề tài về một số trình hỗ trợ khác

Để chứng minh trình hỗ trợ, Tôi liên quan đến lập công thức làm một số bổ sung đến dự án ví dụ Tôi bắt đầu bằng tạo ra tập tin lớp mới được gọi là person.cs trong Models thư mục Bạn thấy được nội dung này tập tin trong Listing 21-12 Loại Người sẽ là lớp mô hình góc nhìn khi Tôi biểu diễn trình hỗ trợ liên quan đến lập công thức, và Địa chỉ và vai trò sẽ giúp tôi thấy trường hợp một số tính năng cao cấp hơn

using System;

namespace HelperMethods.Models { public class

Person {

public int PersonId { get; set; } public string FirstName {

get; set; } public string LastName { get; set; } public

DateTime BirthDate { get; set; }

Trang 16

16

public Address HomeAddress { get; set; } public bool IsApproved { get; set; } public Role Role { get; set; } }

public class Address {

public string Line1 { get; set; } public string

Line2 { get; set; }

Trang 17

17

public string City { get; set; } public string PostalCode {

get; set; } public string Country { get; set; }

Trang 18

18

Đây là cách tiếp cận hai phương thức tiêu chuẩn để đối phó với các form HTML, nơi tôi dựa trên ràng buộc để các MVC

Framework sẽ tạo ra một đối tượng Person từ các dữ liệu mẫu và thông qua nó để phương thức hành động với thuộc tính mô hình HttpPost (Tôi đã giải thích các thuộc tính HttpPost trong Chapter 19 và mô hình ràng buộc là chủ đề của Chapter 24)

Tôi không xử lý các dữ liệu mẫu trong bất kỳ cách nào, vì tôi đang tập trung vào việc làm thế nào để tạo các phần tử trong giao diện Các phương pháp hành động HttpPost chỉ cần gọi các phương thức View và thông qua các đối tượng Person là nó đã nhận như một tham số, trong đó có các tác dụng của hiển thị lại form cho người dùng

Tôi sẽ bắt đầu với một hình thức HTML dẫn tiêu chuẩn và cho bạn thấy làm thế nào để thay thế các bộ phận khác nhau của nó bằng cách sử dụng trình hỗ trợ

Bạn có thể xem phiên bản ban đầu của form trong Listing 21-14, trong đó cho thấy các tập tin hiển thị CreatePerson.cshtml mà tôi thêm vào /Views/Home folder

Ngày đăng: 23/10/2019, 21:16

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w