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

17 chuong 17

29 35 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 29
Dung lượng 0,93 MB

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

Nội dung

Điều này có nghĩa rằng bộ điều khiển chịu trách nhiệm fo r xử lý yêu cầu gửi đến, thực hiện các hoạt động trên mô hình miền, và chọn điểm để trả lại cho người sử dụng.Trong chương này, t

Trang 1

CHƯƠNG 17

Bộ điều khiển và hành động

Mọi yêu cầu mà đến với ứng dụng của bạn được xử lý bởi một bộ điều khiển Bộ điều khiển là miễn phí

để xử lý yêu cầu bất kỳ cách nào nó thấy phù hợp, miễn là nó không đi lạc vào vùng trách nhiệm thuộc về các mô hình và xem Điều này có nghĩa rằng bộ điều khiển không chứa hoặc lưu trữ dữ liệu, và cũng không thể tạo ra người sử dụng giao diện

Trong ASP.NET MVC Framework, bộ điều khiển là các lớp NET có chứa các logic cần thiết để xử lý một yêu cầu Trong chương 3, tôi đã giải thích rằng vai trò của bộ điều khiển là để đóng gói ứng dụng của bạn Điều này có nghĩa rằng bộ điều khiển chịu trách nhiệm fo r xử lý yêu cầu gửi đến, thực hiện các hoạt động trên mô hình miền, và chọn điểm để trả lại cho người sử dụng.Trong chương này, tôi chỉ cho bạn cách điều khiển được thực hiện và những cách khác nhau mà bạn có thể sử dụng bộ điều khiển để nhận và tạo đầu ra Bảng 17-1 cung cấp bản tóm tắt chođiều này chương

Bảng 17-1 Chương. Tổng kết

Ván đè

1 Tạo một bộ điều khiển

2 Nhận thông tin về một yêu cầu

3 Tạo ra một phản ứng từ bộ điều khiển trực tiếp thực hiện giao diện IController

4 Tạo ra một phản ứng từ một bộ điều khiển từ lớp điều khiển

5 Cho MVC Framework mo ̣t cái nhìn tỏng thẻ

6 Truyền dữ liệu từ bộ điều khiển để xem

7 Chuyển hướng trình duyệt tới một URL mới

8 Chuyển hướng trình duyệt tới một URL được tạo ra bởi một tuyến đường

9 Chuyển hướng trình duyệt tới một phương pháp hành động

10 Gửi mã kết quả HTTP cho trình duyệt

Giải pháp

1 Thực hiện giao diện IController hoặc lấy từ các lớp điều khiển

2 Sử dụng các đối tượng bối cảnh và các tài sản hoặc xác định các thông số phương pháp hành động

3 Sử dụng các đối tượng bối cảnh HttpResponse

6 Sử dụng một đối tượng xem mô hình hoặc túi xem

7 Sử dụng Redirect hoặc Chuyển phương pháp thường trực

8 Use theRedirect To Route or Redirect To Route Permanent methods

9 Sử dụng phương pháp Redirect để hành động 23

10 Quay trở lại một Http Tình trạng đối tượng Mã quả hoặc sử dụng một trong các

phương pháp tiện lợi như Http Không tìm thấy

Trang 2

Chuẩn bị Ví dụ Dự án

Để chuẩn bị cho chương này, tôi tạo ra một dự án mới gọi ControllersAndActions sử dụng

các mẫu rỗng, kiểm tra các tùy chọn cho thư mục MVC và tài liệu tham khảo để tạo ra một dự án thử nghiệm đơn vị gọi là ControllersAndActions.Tests. Các đơn vị kiểm tra cái kia tôi sáng

tạo trong cái này chương đừng cần triển khai thực hiện mô hình và

vì vậy tôi đừng cần đến cài đặt Moq đóng hàng, nhưng tôi làm cần đến cài đặt MVC gói để của tôi kiểm tra có quyền truy cập vào các căn cứ

các lớp điều khiển Nhập lệnh sau đây vào Manager Studio NuGet Package trực quan Console:

Cài đặtPackage Microsoft.Aspnet.Mvc version 5.0.0 ControllersAndActions.Tests

-projectname

Thiết la ̣p URL

Một khi bạn đã tạo ra dự án, chọn Properties từ ControllersAndActions Visual Studio

Dự án menu, chuyển sang các Web tab và kiểm tra Cụ trang Tùy chọn trong các Bắt đầu hành động mục Bạn không cần phải cung cấp một giá trị, chỉ cần kiểm tra Tùy chọn.

Giới thiệu Người điều khiển

Bạn đã thấy việc sử dụng các bộ điều khiển trong gần như tất cả các chương cho đến nay Bây giờ nó

là thời gian để có một bước trở lại và nhìn đằng sau hậu trường

Tạo một điều khiển với IControlle r

Trong MVC Framework, các lớp điều khiển phải thực hiện các giao

diện IController từ System.Web.Mvc

không gian tên, mà tôi đã thể hiện trong Liệt kê17-1

Bảng liệt kê 17-1. Các System.Web.Mvc.IController Interfac e

giao diện công cộng IController {

khoảng trống Execute (RequestContext requestContext);

}

Đấm tôi đã nhận định nghĩa của giao diện này bằng cách tải về mã nguồn MVC Framework, mà là

vô tận hữu ích cho việc tìm ra cách thức làm việc phía sau bức màn Bạn có thể tải về mãnguồn

Đây là một giao diện đơn giản Các phương pháp duy nhất, Thực hiện, được gọi khi một yêu cầu là mục tiêu của các lớp điều khiển Các MVC Framework biết mà điều khiển lớp học đã được nhắm mục tiêu vào một yêu cầu đọc giá trị của tài sản bộ điều khiển được tạo ra bởi các dữ liệu định tuyến, hoặc thông qua các lớp học định tuyến tùy chỉnh của bạn như được mô tả trong Chương 15 và 16

Bạn có thể tạo các lớp điều khiển bằng cách thực hiện IController, nhưng nó là một giao diện cấp thấp, và bạn phải làm rất nhiều việc để có được bất cứ điều gì hữu ích được thực hiện Điều đó nói rằng, giao diện IController làm cho một cuộc biểu tình hữu ích về cách điều khiển hoạt động và, cuối cùng, tôi đã tạo ra một tập tin lớp mới gọi làBasicController.cs trong những lý thư mục với các nội dung được hiển thị trong Liệt kê 17-2

Bảng liệt kê 17-2. Nội dung của BasicController.cs Fil e

sử dụng

System.Web.M

vc; sử

Trang 3

hành động string = (string) requestContext.RouteData.Values ["hành động"];

hành động));

}

requestContext.HttpContext.Response.Write (string.Format ("Controller: {0},

Action: {1}", người điều khiển,

}

}

Execute metho d của IController giao diện được thông qua với một

System.Web.Routing.RequestContext đối tượng cung cấp thông tin về các yêu cầu hiện tại và các tuyến đường mà kết hợp nó (và dẫn đến bộ điều khiển này được viện dẫn để xử lý yêu

cầu đó) Các RequestContext lớp định nghĩa hai tài sản, mà tôi đã mô tả trong Bảng17-2

Bảng 17-2. Các thuộc tính xác định bởi các RequestContext Lớp

Tên Mô tả

HttpContextReturns một HttpContextBasevật cái kia mô tả các hiện tại yêu cầu

RouteData Returns một RouteDatađối tượng mô tả các tuyến đường mà phù hợp các yêu cầu

Các HttpContextBase objec t cung cấp quyền truy cập vào một tập các đối tượng mô tả

các yêu cầu hiện tại, được gọi là bối cảnh các đối tượng, và trong đó tôi sẽ trở lại trong phần sau của

chương này Các đối tượng RouteData mô tả các tuyến đường Tôi đã mô tả các RouteData quan trọng tài sản trong Bảng 17-3

Bảng 17-3. Các thuộc tính xác định bởi các RouteData Lớp

Tên Mô tả

Tuyến đường trả vè cácRouteBasemà kết hợp các tuyến đường

RouteHandler trả vè các IRouteHandlerrằng xử lý các tuyến đường

Giá trị trả về một tập hợp các giá trị phân khúc, lập chỉ mục theo tên

TÊN CLASS RẰNG VỚI CƠ SỞ END

Các MVC Framework dựa trên nền tảng ASP.NET để xử lý yêu cầu, mà làm cho rất nhiều ý nghĩa

vì nó được chứng minh, tính năng phong phú và cũng tích hợp vào ứng dụng máy chủ IIS.Một vấn

đề là các lớp học mà việc sử dụng nền tảng ASP.NET đến cung cấp thông tin trong khoảng yêu cầu là không hợp đến đơn vị kiểm tra, một Chìa khóa lợi ích của sử dụng các MVCFramework Microsoft cần thiết để giới thiệu khả năng kiểm thử trong khi duy trì khả năng tương

thích với các ứng dụng ASP.NET Web Forms hiện tại và như vậy giới thiệu các lớp Base, cái gọi là

bởi vì họ có cùng tên với lớp nền tảng cốt lõi ASP.NET theo sau là từ cơ sở Vì vậy, ví dụ, nền tảng ASP.NET cung cấp thông tin bối cảnh về yêu cầu hiện và một số dịch vụ ứng dụng quan trọng thông qua một đối tượng HttpContext. Các cơ sở lớp học đối tác là HttpContextBase, một

Trang 4

ví dụ trong số đó được thông qua vào Execute phương pháp xác định bởi giao

diện IController (và bạn sẽ thấy lớp cơ sở khác trong các ví dụ tiếp theo) Các lớp học ban đầu và cơ sở xác định các thuộc tính và phương pháp tương tự, nhưng các lớp học cơ

sở luôn trừu tượng, có nghĩa là họ có thể dễ dàng được sử dụng để kiểm tra đơn vị

Đôi khi bạn sẽ nhận được một thể hiện của một trong những lớp học ASP.NET ban đầu, chẳng hạn như HttpContext nhưng cần phải tạo ra một lớp cơ sở MVC-thân thiện, chẳng hạn

như HttpContextBase. Bạn có thể làm điều này bằng cách sử dụng một trong các

lớp Wrapper, mà có cùng tên như các lớp học ban đầu cộng với

lời Wrapper, nhưHttpContextWrapper Các lớp wrapper có nguồn gốc từ các lớp cơ

sở và có nhà xây dựng mà chấp nhận một thể hiện của lớp ban đầu, như thế này:

HttpContext myContext = getOriginalObjectFromSomewhere

(); HttpContextBase MyBase = new HttpContextWrapper (myContext);

Có gốc, Base và Wrapper lớp suốt System.Web không gian tên để có thể hỗ trợ ASP.NET MVC Framework và các ứng dụng cũ Web Forms liền mạch

Tôi chỉ cho bạn cách sử dụng các loại RouteBase và IRouteHandler để tùy chỉnh hệ

thống định tuyến trong Chương16

Trong ví dụ này, tôi sử dụng các tài sản giá trị để có được các giá trị của bộ điều khiển và hành động biến phân đoạn và ghi chúng vào phản ứng

Lưu ý phần của vấn đề khi tạo bộ điều khiển tùy chỉnh là bạn không có quyền truy cập vào các tính

năng như xem Điều này có nghĩa rằng bạn phải làm việc ở một mức độ thấp hơn và là lý do mà tôi viết nội dung của tôi trực tiếp cho khách hàng Các tài sản HttpContextBase.Response trả về một đối tượng HttpResponseBase cho phép bạn cấu hình và thêm vào các phản ứng đó sẽ được gửi đến khách hàng Đây là một touch-point giữa các nền tảng ASP.NET và MVC Framework và một

mà tôi mô tả trong chiều sâu trong các Pro ASP.NET MVC 5khung Cuốn sách nền tảng, mà

sẽ được xuất bản bởi

Apress trong Năm 2014

Nếu bạn chạy các ứng dụng và điều hướng đến / Basic / Index, bạn có thể thấy sản lượng tạo ra bởi các điều khiển tùy chỉnh, như thể hiện trong hình17-1

Hình 17-1. Một kết quả được tạo ra từ các BasicController lớp

Thực hiện các giao diện IController cho phép bạn tạo ra một lớp học mà các MVC Framework công nhận như một bộ điều khiển và gửi yêu cầu tới, không có bất kỳ giới hạn về cách thức yêu cầu được

xử lý và trả lời Đây là một ví dụ tốt đẹp bởi vì nó cho thấy bạn làm thế nào có thể mở rộng các MVC Framework là, ngay cả đối với các khối xây dựng quan trọng như bộ điều khiển, nhưng nó sẽ được khó khăn để viết một ứng dụng phức tạp này đường

Tạo một điều khiển bởi Xuất phát từ điều khiển Lớp

Như ví dụ trước đó đề nghị, các MVC Framework là vô tận tùy biến và mở rộng Bạn có thể thực hiện các giao diện IController để tạo ra bất kỳ loại yêu cầu xử lý và kết quả là thế hệ mà bạn yêu cầu Không giống như các phương pháp hành động? Không quan tâm vì những quan điểm tả? Sau đó, bạn chỉ có thể lấy các vấn đề trong tay của chính bạn và viết một, nhanh hơn, và cách thanh

lịch hơn xử lý yêu cầu Hoặc là bạn có thể xây dựng trên các tính năng cái kia các Microsoft Đội MVC Framework có cung cấp, đó là

Trang 5

đạt được bằng cách bắt nguồn điều khiển của bạn từ các lớp System.Web.Mvc.Controller.

System.Web.Mvc.Controller là lớp học mà cung cấp các yêu cầu xử lý hỗ trợ hầu hết các nhà phát triển MVC sẽ quen thuộc với Đây là lớp học tôi đã được sử dụng trong tất cả các ví dụ trong các

chương trước Lớp điều khiển cung cấp ba trọng điểm các tính năng:

Phương pháp hành động: hành vi của một bộ điều khiển được phân chia thành nhiều phương

pháp (thay vì chỉ có một duy nhất phương pháp Execute ()). Mỗi phương pháp hànhđộng được tiếp xúc trên một URL khác nhau và được gọi với thông số trích từ đến yêu cầu

Kết quả hành động: Bạn có thể trả về một đối tượng mô tả các kết quả của một hành động (ví dụ, vẽ

một cái nhìn, hoặc chuyển hướng đến một URL khác nhau hoặc phương pháp hànhđộng), sau đó

được thực hiện thay mặt bạn Việc tách biệt giữa xác định kết quả và thực hiện chúng đơn giản hoá

đơn thử nghiệm

Bộ lọc: Bạn có thể gói gọn hành vi tái sử dụng (ví dụ, xác thực, như bạn đã thấy trong Chương 12) như các bộ lọc, và sau đó thẻ mỗi hành vi vào một hoặc nhiều bộ điều khiển hoặc các phương pháp hành động bằng cách đặt một thuộc tính trong bạn mã nguồn

Trừ khi bạn có một yêu cầu cụ thể trong tâm trí, cách tốt nhất để tạo ra các bộ điều khiển là để lấy được từ các lớp điều khiển và, như bạn có thể mong ước, cái này Là những gì Visual Studiolàm khi

nó tạo một mới mẻ người điều khiển để đáp ứng với các Thêm mục trình đơn Scaffold.Bảng liệt

kê 17-3 cho thấy một điều khiển đơn giản tạo ra theo cách này, được gọi làDerivedController, tạo ra bằng cách sử dụng MVC 5 Controller - tùy chọn Empty, với một số changesto đơn giản thiết lập một thuộc tính ViewBag và chọn một góc nhìn

Bảng liệt kê 17-3. Các ontents của DerivedController.cs Fil e

công ActionResult Index () {

ViewBag.Message = "Hello từ DerivedController Mục lục

số Để tạo điểm này, tạo ra các Views / thư mục nguồn gốc, kích chuột phải vào nó và lựa

chọn Thêm MVC 5 Xem trang (Razor) từ thực đơn Đặt tên choMyView.cshtml và nhấp vào nút OK để tạo ra các tập tin view Thiết lập các nội dung của tập tin để xem phù hợp

Trang 6

<h2> MyView </ h2>

Lời nhắn: @ ViewBag.Message

Nếu bạn khởi động ứng dụng và điều hướng đến / Deri ved / Index, phương pháp hành

động sẽ được gọi và nhìn tôi đặt tên sẽ được trả lại, như thể hiện trong Con số17-2

Công việc của một dẫn xuất của lớp điều khiển là thực hiện phương pháp hành động, đạt được

bất kỳ đầu vào là cần thiết để xử lý yêu cầu, và phát ra một phù hợp phản ứng Các vô

sốcách để làm cái này là phủ trong phần còn lại của cái này chương

Tiếp nhận yêu cầu Đạt một

Bộ điều khiển thường xuyên cần truy cập dữ liệu từ các yêu cầu gửi đến, chẳng hạn như các giá trị

chuỗi truy vấn, giá trị hình thức, và các thông số phân tích từ các URL của các hệ thống định tuyến Có

ba cách chính để truy cập cái kia dữ liệu:

Giải nén nó từ một tập hợp các ngữ cảnh đối tượng.

Có các dữ liệu này là tham số để phương thức hành động của mình Rõ ràng gọi mô hình của khuôn

khổ ràng buộc tính năng.

Ở đây, tôi nhìn vào các phương pháp tiếp cận để có được đầu vào cho phương thức hành động của

bạn, tập trung vào các đối tượng sử dụng bối cảnh và các thông số phương pháp hành

động.Trong Chương 24, tôi bao gồm ràng buộc trong mô hình chiều sâu

Bắt dữ liệu từ Context Đối tượng

Khi bạn tạo một bộ điều khiển bằng cách bắt nguồn từ lớp cơ sở troller Con, bạn sẽ có được quyền

truy cập vào một tập hợp các đặc tính thuận tiện để truy cập thông tin về các yêu cầu Các tính chất

này bao gồm yêu cầu, đáp ứng, RouteData, HttpContext, và Server. Mỗi cung cấp thông tin về một

khía cạnh khác nhau của yêu cầu Tôi muốn nói đến nhữngđặc tính như tiện lợi, vì họ từng lấy loại

khác nhau của dữ liệu từ ControllerContext dụ của yêu cầu (có thể được truy cập thông qua các tài

sản Controlle r.ControllerContext). Tôi đã mô tả một số đối tượng bối cảnh thông dụng nhất

Request.Cookies HttpCookieCollection Cookies được gửi bởi trình duyệt với này yêu cầu

Request.HttpMethod chuỗi Các phương pháp HTTP (verb, như thế như NHẬN ĐƯỢChoặc

làPOST)được sử dụng cho cái này yêu cầuRequest.Headers NameValueCollection Các tập hợp đầy đủ các tiêu đề HTTP gửi với điều này yêu cầu

Request.UserHostAddress chuỗi Các Địa chỉ IP của việc lập người dùng cái này yêu cầu

RouteData.Route RouteBase Các chọn RouteTable.Routeslối vào vì cái này yêu cầuRouteData.Values RouteValueDictionary Hoạt động tuyến đường thông số (một trong hai chiết

xuất từ URL hoặc làmặc định giá trị)HttpContext.Application HttpApplicationStateBase Nhà nước ứng dụng cửa hàng

HttpContext.Cache Bộ nhớ cache Bộ nhớ cache ứng dụng cửa hàng

Trang 7

HttpContext.Items IDictionary Cửa hàng Nhà nước cho hiện tại yêu cầu

HttpContext.Session HttpSessionStateBase Tiểu bang cửa hàng vì các khách buổi họp

Người dùng IPrincipal Thông tin xác thực về đăng nhập người dùng

TempData TempDataDictionary Mục dữ liệu tạm thời được lưu trữ cho người dùng hiện tại

Các tính chất cá nhân mà tôi đề cập đến đây- Yêu cầu, HttpContext, và như vậy trên cung cấp

cho các đối tượng bối cảnh Tôi sẽ không đi vào chi tiết trong cuốn sách này (vì họ là một phần của nền

tảng ASP.NET), nhưng họ cung cấp quyền truy cập vào một số thông tin và tính năng hữu ích và có giá

trị khai thác Một phương pháp hành động có thể sử dụng bất kỳ các đối tượng bối cảnh để có được

thông tin về yêu cầu, như Bảng liệt kê 17-5 thể hiện trong các hình thức của một hành động

giả phương pháp

Bảng liệt kê 17-5. Một phương pháp hành động Sử dụng Context Objects để Nhận Informatio

n Về một Yêu cầu

công ActionResult RenameProduct () {

// Truy cập thuộc tính khác nhau từ ngữ cảnh đối tượng

// Lấy dữ liệu gửi từ Request.Form

chuỗi oldProductName = Request.Form

["oldname"]; chuỗi

newProductName = Request.Form ["NewName"];

Kết quả bool = AttemptProductRename (oldProductName, newProductName);

Bạn có thể khám phá những phạm vi rộng lớn của có sẵn thông tin yêu cầu bối cảnh sử

dụng IntelliSense (trong một phương thức hành động, nhập này Và duyệt các cửa sổ pop-up), và các

mạng Microsoft Developer (nhìn lên System.Web.Mvc.Controller và các lớp cơ sở của nó, hoặc

là System.Web.Mvc.ControllerContext)

Sử dụng phương pháp hành động Thông số

Như bạn đã thấy trong các chương, phương pháp hành động trước đó có thể lấy các thông

số Đây là một cách gọn gàng để nhận dữ liệu đến hơn giải nén nó bằng tay từ các đối tượng bối

cảnh, và nó làm cho các phương pháp hành động của bạn dễ dàng hơn để đọc Ví dụ, giả sử tôi

có một phương pháp hành động sử dụng bối cảnh các đối tượng như cái này:

công ActionResult ShowWeatherForecast () {

chuỗi thành phố = (string) RouteData.Values ["thành phố"];

DateTime forDate = DateTime.Parse (Request.Form ["forDate"]);

Trang 8

// Thực hiện dự báo thời tiết ở đây

return View ();

}

Tôi có thể viết lại nó để sử dụng các thông

số, như cái này:

Mẹo Điều đáng chú ý là phương pháp hành động không được phép có ra hoặc các thông

số ref. Nó sẽ không làm cho bất kỳ ý nghĩa nếu họ đã làm và các MVC Framework đơn giản là sẽ

ném một ngoại lệ nếu nó thấy như một tham số

Các MVC Framework sẽ cung cấp giá trị cho các tham số phương pháp hành động bằng cách kiểm tra các đối tượng bối cảnh và tính chất tự động, bao gồm

cả Request.QueryString,Request.Form, và RouteData.Values. Tên của các thông số được xử lý trường hợp-insensitively, do đó, một số phương pháp hành động gọi là thành phố có thể được dân cư của một giá trị từ Request.Form ["City"], ví dụ

Lớp điều khiển cơ sở lấy giá trị cho các tham số phương pháp hành động bằng cách sử dụng các thành

phần MVC Framework được gọi là các nhà cung cấp giá trị và mô hình chất kết dính s.Cung cấp dịch

vụ giá trị đại diện cho tập hợp các mục dữ liệu có sẵn để điều khiển của bạn Có được xây dựng

trong các nhà cung cấp giá trị mà lấy hàng từ Request.Form, Request.QueryString,

Request.Files, và RouteData.Values. Các giá trị này sau đó được chuyển tới mô hình chất kết dính mà cố gắng để bản đồ chúng đến các loại mà hành động của bạn

phương pháp yêu cầu như thông số

Các chất kết dính mô hình mặc định có thể tạo ra và đối tượng của bất kỳ loại NET, bao gồm cả các bộ sưu tập và các loại tùy chỉnh dự án cụ thể Bạn đã thấy một ví dụ về điều này trongchương

11 khi gửi mẫu từ các quản trị viên đã được trình bày một phương pháp hành động như một đối

tượng sản phẩm duy nhất, mặc dù các giá trị cá nhân đã bị phân tán giữa các yếu tố của các dạng HTML Tôi bao gồm các nhà cung cấp giá trị và chất kết dính mô hình trong chiều sâu

trong Chương24

Hiểu Tùy chọn và bắt buộc Parameter s

Nếu các MVC Framework không thể tìm thấy một giá trị cho một tham số kiểu tham chiếu (chẳng

hạn như là một chuỗi hoặc đối tượng), phương pháp hành động sẽ vẫn được gọi là, nhưng sử

dụng một giá trị null cho tham số đó Nếu một giá trị không thể được tìm thấy cho một tham số kiểu giá trị (như int hoặc đôi), sau đó là một ngoại lệ sẽ được ném ra, và phương pháp hành động sẽ không được

gọi Dưới đây là một cách khác để suy nghĩ về nó:

Thông số giá trị kiểu là bắt buộc Để làm cho họ tùy chọn, hoặc chỉ định một giá trị mặc định (xem phần sau) hoặc thay đổi các tham số kiểu cho một loại nullable (như int? HoặcDateTime?), Vì vậy các MVC Framework có thể vượt qua null nếu không có giá trị là có thể dùng được, có sẵn

Trang 9

Thông số tham khảo loại là tùy chọn Để làm cho họ bắt buộc (để đảm bảo rằng một giá trị null không được thông qua), thêm một số mã để trên cùng của phương pháp hành động để từ chối các giá trị null. Ví dụ, nếu giá trị bằng null, ném một ArgumentNullException.

Spec ifying Mặc định Thông số Giá trị

Nếu bạn muốn để xử lý yêu cầu mà không chứa lues va cho tham số phương thức hành động, nhưng bạn không muốn kiểm tra giá trị null trong mã của bạn hoặc có trường hợp ngoại lệ ném ra, bạn có thể sử dụng các tham số tùy chọn tính năng C # để thay thế Bảng liệt kê 17-6 cung cấp một trình diễn

Bảng liệt kê 17-6. Sử dụng tính năng C # Tùy chọn thông số trong một hành động Phương pháp

Framework sẽ cố gắng để có được các giá trị từ các yêu cầu đối với các thông số này, nhưng nếu

không có giá trị có sẵn, giá trị mặc định tôi đã chỉ định sẽ được sử dụng thay cho

Đối với các tham số chuỗi, truy vấn, điều này có nghĩa là tôi không cần phải kiểm tra giá

trị null. Nếu yêu cầu tôi chế biến đã không chỉ định một truy vấn, sau đó phương pháp hành động sẽ được gọi với các chuỗi tất cả Đối với các tham số int, Tôi không cần phải lo lắng về các yêu

cầu dẫn đến sai sót khi không có giá trị trang: phương pháp này sẽ đượcgọi với giá trị mặc định của

1. Tham số tùy chọn có thể được sử dụng với nhiều loại chữ, đó là loại mà bạn có thể xác định mà không sử dụng các từ khóa mới, bao gồm string, int, và đôi

Thận trọng Nếu một yêu cầu có chứa một giá trị cho một tham số nhưng nó không thể được chuyển

đổi sang các loại chính xác (ví dụ, nếu người sử dụng cung cấp cho một chuỗi nonnumeric cho một tham

số int), sau đó khuôn khổ sẽ vượt qua giá trị mặc định cho loại tham số ( Ví dụ, 0 cho một tham

số int), và sẽ đăng ký giá trị cố gắng như một lỗi xác nhận trong một bối cảnh đặc biệtđối tượng được gọi là ModelState Trừ khi bạn kiểm tra cho xác nhận lỗi trong ModelState, bạn có thể có

được thành lẻ các tình huống mà các người dùng đã nhập dữ liệu xấu thànhmột hình thức, nhưng yêu cầu được xử lý như là mặc dù người sử dụng đã không nhập bất kỳ dữ liệu hoặc đã nhập giá trị mặc định Xem Chương 25 để biết chi tiết về xác nhận vàModelState, mà có thể được sử dụng để tránh các vấn đề như vậy

Sản xuất Đầu ra

Sau khi một bộ điều khiển đã xử lí xong một yêu cầu, nó thường cần phải tạo ra một phản ứng Khi tôi tạo ra bộ điều khiển trần kim loại bằng cách thực hiện các giao diện IControllertrực tiếp, tôi cần phải chịu trách nhiệm về mọi khía cạnh của xử lý một yêu cầu, kể ra tạo phản ứng với các khách hàng Nếu tôi muốn gửi đi một HTML phản ứng, vì thí dụ, sau đó Tôi phải tạo

và lắp ráp các dữ liệu HTML và gửi nó cho khách hàng sử dụng các phương

pháp Response.Write. Tương tự như vậy, nếu tôi muốn chuyển hướng trình duyệt của người dùng tới URL khác, tôi cần phải gọi phương thức Response.Redirect và vượt qua các URL Tôi quan tâm trực tiếp Cả hai cách trên đều được thể hiện trong Liệt kê 17-7, trong đó cho thấy các phụ kiện

Trang 10

hành động string = (string) requestContext.RouteData.Values ["hành động"];

if (action.ToLower () == "chuyển hướng") {requestContext.HttpContext.Response.Redirect ("/ Bắt nguồn / Ind

} Else { requestContext.HttpContext.Response.Write (string.Format ("Controller: {0}, Action: {1}", điều khiển, hành động));

}

}

}

}

Bạn có thể sử dụng phương pháp tương tự khi bạn đã bắt nguồn điều khiển của

bạn từ các lớp điều khiển Lớp HttpResponseBase được trả về khi bạn đọc những tài

sảnrequestContext.HttpContext.Response trong phương thức Execute của bạn có sẵn

thông qua thuộc tính Controller.Response, như thể hiện trongLiệt kê17-8, trong đó cho

thấy các cải tiến cho DerivedController lớp

Bảng liệt kê 17-8. Sử dụng tài sản để đáp ứng Tạo ra trong DerivedController.cs Fil e

công ActionResult Index () {

ViewBag.Message = "Hello từ DerivedController Mục lục

trở về Xem ("MyView");

}

public void ProduceOutput () {

if (Server.MachineName == "TINY") {Response.Redirect ("/ Basic / Index");

} Else { ProduceOutput ");

} Response.Write ("Bộ điều khiển: Có nguồn gốc, hành động:

}

}

}

Trang 11

Các metho ProduceOutput d sử dụng giá trị của tài sản Server.MachineName để quyết định những phản ứng để gửi cho khách hàng (TINY là tên của một trong các máyphát triển của

tôi.) Phương pháp này hoạt động, nhưng nó có một vài các vấn đề:

Các lớp điều khiển phải có các nội dung của HTML hoặc URL cấu trúc, mà làm cho các lớp học khó khăn hơn để đọc và duy trì

Thật khó có thể kiểm tra đơn vị một bộ điều khiển mà tạo ra phản ứng của nó trực tiếp đến sản lượng Bạn cần phải tạo ra việc triển khai mô hình của đối tượng Response, và sau đó có thể xử lý đầu

ra mà bạn nhận được từ bộ điều khiển để xác định những gì đầu ra đại diện Điều này có thể có nghĩa là phân tích cú pháp HTML cho các từ khóa, ví dụ, đó là một kéo dàivà đau đớn qui trình

Xử lý các chi tiết đẹp của mỗi phản ứng theo cách này là tẻ nhạt và dễ bị lỗi Một số lập trình viên sẽ thích kiểm soát tuyệt đối rằng việc xây dựng một bộ điều khiển liệu mang lại, nhưngnhững người bình thường nhận được thất vọng khá Mau

May mắn thay, các MVC Framework có một tính năng tốt đẹp mà giải quyết tất cả các vấn

đề này, được gọi là kết quả hành động của ông Những phần sau đây giới thiệu các khái niệmkết

quả hoạt động và hiển thị cho bạn những cách khác nhau mà nó có thể được sử dụng để tạo ra phản ứng từ bộ điều khiển

Hành động hiểu biết Kết quả

Các MVC Framework sử dụng kết quả hành động để tách và nêu ý định từ ý định thực hiện Khái niệm

này rất đơn giản một khi bạn đã làm chủ được nó, nhưng phải mất một thời gian để có được đầu của bạn xung quanh cách tiếp cận ban đầu bởi vì có một chút về mình đi về

Thay vì làm việc trực tiếp với các đối tượng Response, phương pháp hành động trả về một đối tượng dẫn xuất từ lớp ActionResult mô tả những gì các phản ứng từ bộ điều khiển sẽ được, chẳng hạn như việc render khung cảnh hoặc chuyển hướng đến một phương pháp URL hay hành

động Nhưng, và đây là nơi mà các gián tiếp đến trong-bạn không tạo ra trực tiếp cácphản ứng

Thay vào đó, bạn tạo một đối tượng ActionResult rằng các quá trình MVC Framework để tạo ra kết quả cho bạn, sau khi các phương pháp hành động đã được gọi

mà bạn lưu trữ và vượt qua xung quanh đối tượng mô tả các hoạt động được thực

hiện Xemhttp://en.wikipedia.org/wiki/Command_pattern để biết thêm chi tiết

Khi các MVC Framework nhận một đối tượng ActionResult từ một phương pháp hành động, nó gọi phương thức ExecuteResult xác định bởi đối tượng đó Các kết quả thực hiện hành động sau

đó giao dịch với các đối tượng Response cho bạn, tạo ra các đầu ra tương ứng với ý định của bạn Để chứng minh cách làm việc này, tôi tạo ra một thư mục cơ sở hạ tầng và thêm vào một tập tin

lớp mới gọi là C ustomRedirectResult.cs với nó, mà tôi sau đó được sử dụng để xác định việc thực tùy chỉnh ActionResult được hiển thị trong Liệt kê 17-9

Bảng liệt kê 17-9. Nội dung của CustomRedirectResult.cs Fil e

sử dụng System.Web.Mvc;

namespace

ControllersAndActions.Infrastructure {public class

CustomRedirectResult: ActionResult {

public string Url {get; bộ; }

public override void ExecuteResult (ControllerContext

context) {string fullurl = UrlHelper.GenerateContentUr

l (Url, context.HttpContext);

context.HttpContext.Response.Redirect (fullurl);

}

}

}

Trang 12

Tôi dựa trên lớp này trên cách mà các lớp System.Web.Mvc.RedirectResult hoạt động Một trong những lợi ích của MVC Framework mã nguồn mở được là bạn có thể thấycách làm việc đằng sau hậu trường Lớp CustomRedirectResult là đơn giản hơn rất nhiều so với tương đương

với MVC, nhưng là đủ cho mục đích của tôi trong này chương

Khi tôi tạo ra một thể hiện của lớp RedirectResult, tôi vượt qua trong các URL tôi muốn chuyển hướng người dùng tới Phương pháp ExecuteResult, mà sẽ được thực hiện bởi các khung MVC khi phương thức hành động đã hoàn thành, được các đối tượng Response cho truy vấn thông qua đối tượng ControllerContext rằng khuôn khổ cung cấp,và gọi phương thức Redirect, đó chính xác

là những gì tôi đã làm trong bare-bones thực hiện IController trong Liệt kê 17-7 Bạn có thể nhìn thấy như thế nào tôi đã sử dụng các lớp CustomRedirectResult trong bộ điều khiển nguồn gốc trong Bảng liệt 17-10

Bảng liệt 17-10. Sử dụng Class CustomRedirectResult trong DerivedController.cs Fil e

công ActionResult Index () {

ViewBag.Message = "Hello từ DerivedController Mục lục

}

}

trả về null;

Response.Write ("Bộ điều khiển: Có nguồn gốc, hành động:

Chú ý rằng tôi đã phải thay đổi kết quả của các phương pháp hành động để trả lại một ActionResult. Tôi trở về null nếu tôi không muốn các MVC Framework để làm bất cứ điều

gì sau khi phương thức hành động đã được thực hiện, đó là những gì tôi đã làm khi tôi làm không trả lại một CustomRedirectResult dụ

KIỂM SOÁT UNIT NGHIỆM VÀ HÀNH ĐỘNG

Trang 13

Nhiều các bộ phận của các MVC Framework thiết kế đến tạo điều kiện đơn vị kiểm tra, và cái

này Là đặc biệt thật vì hành động và bộ điều khiển Có một vài lý do cho điều này hỗ trợ:

Bạn có thể kiểm tra hành động và bộ điều khiển bên ngoài một máy chủ web Các đối tượng bối cảnh được truy cập thông qua các lớp học cơ sở (như HttpRequestBase), đó là dễ dàng để thử

Bạn không cần phải phân tích bất kỳ HTML để kiểm tra kết quả của một phương pháp hành động Bạn

có thể kiểm tra việc ActionResult

đối tượng được trả về để đảm bảo rằng bạn nhận được sự mong đợi kết quả

Bạn không cần phải mô phỏng các yêu cầu của khách hàng Hệ thống ràng buộc mô hình MVC Framework cho phép bạn viết các phương pháp hành động tiếp nhận đầu vào là các tham số của phương thức Để thử nghiệm một phương pháp hành động, bạn chỉ cần gọi phương thức hành động trực tiếp và cung cấp các giá trị tham số mà bạn quan tâm bạn

tôi sẽ hiển thị bạn làm cách nào đến sáng tạo đơn vị kiểm tra vì các khác loại của hoạt động kết

quả khắp nơi cái này chương

Đừng quên rằng kiểm tra đơn vị không phải là câu chuyện hoàn chỉnh Hành vi phức tạp trong một ứng dụng phát sinh khi các phương pháp hành động được gọi là theo thứ tự Đơn vị kiểm tra tốt nhất là kết hợp với các thử nghiệm khác phương pháp tiếp cận

Bây giờ bạn đã thấy như thế nào là kết quả hành động chuyển hướng tùy chỉnh làm việc, tôi có thể chuyển sang một tương đương cung cấp bởi các MVC Framework, trong đó có nhiều tính năng hơn và

đã được kiểm tra kỹ lưỡng bởi Microsoft Liệt kê 17-11 cho thấy sự thay đổi đến nguồn gốc người điều khiển

Bảng liệt 17-11. Sử dụng các Built-in RedirectResult Object trong DerivedController.cs Hồ sơ

công ActionResult ProduceOutput () {

return new RedirectResult ("/ Basic / Index");

}

Tôi đã gỡ bỏ các câu lệnh điều kiện từ các phương pháp hành động, có nghĩa là nếu bạn bắt đầu ứng dụng và điều hướng đến / nguồn gốc phương pháp / ProduceOutput,trình duyệt của

bạn sẽ được chuyển đến / Basic / Index URL

Để thực hiện phương pháp mã hành động đơn giản, lớp điều khiển bao gồm các phương pháp tiện lợi để tạo ra các loại khác nhau của các đối tượng ActionResult. Vì vậy, như mộtví dụ, tôi có

thể đạt được hiệu quả trong Liệt kê 17-11 bằng cách trả lại kết quả của các phương

pháp Redirect, như thể hiện trong Liệt kê17-12

Bảng liệt 17-12. Sử dụng một bộ điều khiển tiện lợi Method trong DerivedController.cs Fil e

công ActionResult ProduceOutput () {

trở về Chuyển ("/ Basic / Index");

}

Không có gì trong hệ thống hành động mà kết quả là đặc biệt phức tạp, nhưng nó sẽ giúp bạn tạo ra với mã đơn giản, sạch hơn và nhất quán hơn, đó là dễ dàng hơn để đọc và dễ dàng hơn để kiểm tra đơn vị

Trong trường hợp của một chuyển hướng, ví dụ, bạn có thể chỉ đơn giản là kiểm tra xem trở về phương pháp hành động một thể hiện của

RedirectResult và rằng Url tài sản có chứa các mục tiêu mà bạn mong đợi

Các MVC Framework chứa một số được xây dựng trong các loại quả hành động, được thể hiện

trong Bảng 17-5 Tất cả các loại đều được bắt nguồn từ ActionResult, và nhiều người trong số họ có thuận tiện helper phương pháp trong việc điều khiển lớp Trong các sau phần, tôi sẽ chỉ cho bạn cách sử dụng các phần lớn quan trọng của các loại quả

Bảng 17-5 Built-in ActionResult Loại s

Trang 14

Kiểu Miêu tả Người giúp đỡ Phương

Vấn đề một HTTP 301 hoặc 302 chuyển hướng đến một phương pháp hành động hay cụ thể mục tuyến đường,

tạo một URL theo để bạn định tuyến cấu hình

RedirectToAction RedirectToActionPermanent RedirectToRoute RedirectToRoutePermanent

RedirectResult vấn đề một HTTP 301 hoặc 302 chuyển hướng đến một cụ thể URL Chuyển RedirectPermanent

Returns sống văn bản dữ liệu để các trình duyệt, tùy chọn thiết lập một content-typeContentResult

FileResult

cú đội đầu Nội dung

Truyền dữ liệu nhị phân (chẳng hạn như một tập tin từ ổ đĩa hoặc một mảng byte trong bộ nhớ)

trực tiếp cho các trình duyệt Hồ sơ

Serializes một đối tượng NET trong định dạng JSON và gửi nó như là các phản

ứng Kiểu này của phản ứng Là hơn thường tạo ra sử dụng các Web API tính

năng, cái nào

JsonResult

tôi diễn tả trong Chương 27, nhưng bạn có thể thấy loại hành động này được sử dụng trong Chương 23.

Gửi một đoạn mã nguồn JavaScript mà phải được thực hiện bởi các

JSON

JavaScriptResul t

Trình duyệt JavaScript

Sets trạng thái HTTP phản ứng mã 401 (có nghĩa là " không được phép "),

HttpUnauthorizedResultcái nào nguyên nhân các hoạt động xác thực cơ chế (hình thức xác thực hoặc là

Cửa sổ xác thực) để hỏi những người truy cập vào đăng nhập Không ai

Các loại phổ biến nhất của phản ứng từ một phương pháp hành động là để tạo ra HTML và

gửi nó đến trình duyệt Để chứng minh làm thế nào để làm cho quan điểm, tôi đã thêm một bộ điều

khiển gọi là Ex dồi dào cho dự án Bạn có thể xem nội dung của

các ExampleController.cs lớp tập tin trong Listing 17-13

Bảng liệt 17-13 Nội dung của ExampleController.cs Hồ sơ

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

TỪ KHÓA LIÊN QUAN

w