Đ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 1CHƯƠ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 2Chuẩ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 3hà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 4ví 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 7HttpContext.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 9Thô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 10hà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 11Cá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 12Tô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 13Nhiề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 14Kiể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ơ