1. Trang chủ
  2. » Giáo Dục - Đào Tạo

18 chuong 18 tủ tài liệu bách khoa

58 41 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 58
Dung lượng 1,48 MB

Nội dung

CHAPTER 18 Bộ lọc Bộ lọc chèn logic thêm vào trình xử lý MVC Framework Họ cung cấp cách đơn giản dễ dàng để thực vấn đề xuyên suốt (cross-cutting Thuật ngữ đề cập đến chức sử dụng tất ứng dụng không phù hợp gọn gàng vào nơi, nơi phá vỡ tách quan tâm mẫu Ví dụ cổ điển mối quan tâm xuyên suốt đăng nhập, ủy quyền, nhớ đệm Trong chương này, cho bạn loại khác lọc mà MVC Framework hỗ trợ, làm để tạo sử dụng lọc tùy chỉnh, làm để kiểm soát việc thi hành án Bảng 18-1 cung cấp tóm tắt cho chương Table 18-1 Chapter Summary Problem Tiêm logic thêm vào chế biến theo yêu cầu Hạn chế phương pháp hành động cho người dùng nhóm cụ thể xác thực yêu cầu Quá trình lỗi thực yêu cầu Tiêm logic có mục đích chung vào q trình xử lý u cầu Kiểm tra thay đổi kết tạo phương pháp hành động Sử dụng lọc mà khơng có thuộc tính Solution Listing Áp dụng lọc để điều khiển 1–8 phương pháp hành động Sử dụng lọc cho phép 9–12 Sử dụng lọc xác thực Sử dụng lọc ngoại lệ Sử dụng lọc hành động 13–19 20–30 31–35 Sử dụng lọc kết 36–41 Sử dụng phương pháp điều khiển tích hợp Xác định lọc áp dụng cho tất Xác định lọc toàn cầu phương pháp hành động ứng dụng Kiểm soát thứ tự mà lọc thực thi Sử dụng tham số thứ tự Ghi đè lọc toàn cầu điều khiển cho Sử dụng lọc viết chèn ( phương pháp hành động override) 42 43–46 47–49 50–54 Chuẩn bị dự án Ví dụ Trong chương tơi tạo dự án MVC gọi lọc cách sử dụng mẫu rỗng, kiểm tra tùy chọn để thêm thư mục core MVC tham khảo Tôi tạo điều khiển chủ có phương pháp hành động thể Liệt kê 18-1 Tôi tập trung vào việc điều khiển chương này, tơi trở giá trị chuỗi từ phương pháp hành động, đối tượng ActionResult Điều có tác dụng gây MVC Framework để gửi giá trị chuỗi trực tiếp vào trình duyệt, cách thơng qua cơng cụ xem Razor Listing 18-1 Nội dung tập tin HomeController.cs using System.Web.Mvc; namespace Filters.Controllers { public class HomeController : Controller { public string Index() { return "This is the Index action on the Home controller"; } } } Ngay sau chương này, chứng minh làm bạn sử dụng tính gọi lọc MVC xác thực, cho cần để thực số xác thực người dùng đơn giản Như tơi giải thích Chương 12, tơi khơng bao gồm tính bảo mật tảng hạ ASP.NET sách này, Apress tự phân phối chương an ninh từ Pro ASP.NET MVC Platform sách tới tơi xuất năm 2014 vậy, để chứng minh xác thực lọc đặc trưng, phần MVC Framework, sử dụng phương pháp tương tự tiếp nhận Chương 12 xác định thông tin người dùng tĩnh file Web.config, thể Liệt kê 18-2 Listing 18-2 Xác định Credentials người dùng tập tin Web.config Tôi xác định hai người sử dụng, sử dụng quản trị, giao cho họ mật khẩu, bí mật, để giữ cho thứ đơn giản Tơi sử dụng hình thức xác nhận lần tơi sử dụng thuộc tính loginUrl để xác định yêu cầu không thẩm định nên chuyển đến / Tài khoản / Đăng nhập URL Trong Liệt kê 18-3, bạn xem nội dung điều khiển tài khoản thêm vào dự án có hành động Login mục tiêu cấu hình định tuyến mặc định Listing 18-3 Nội dung File AccountController.cs using System.Web.Mvc; using System.Web.Security; namespace Filters.Controllers { public class AccountController : Controller { public ActionResult Login() { return View(); } [HttpPost] public ActionResult Login(string username, string password, string returnUrl) { password); bool result = FormsAuthentication.Authenticate(username, "Admin")); if (result) { FormsAuthentication.SetAuthCookie(username, false); return Redirect(returnUrl ?? Url.Action("Index", } else { ModelState.AddModelError("", "Incorrect username or password"); return View(); } } } } Để tạo quan điểm thu thập thông tin ứng viên từ người sử dụng, tạo Views /Shared Folder kích chuột phải vào Chọn Thêm MVC Xem trang (Razor), đặt tên Login.cshtml nhấp vào nút OK để tạo xem Chỉnh sửa điểm để phù hợp với nội dung hiển thị Liệt kê 18-4 Lưu ý tạo nhìn chia sẻ tơi có thêm điều khiển xác thực thứ hai sau chương muốn sử dụng lại xem Listing 18-4 Nội dung File Login.cshtml @{ Layout = null; } @using (Html.BeginForm()) { @Html.ValidationSummary()

Username:

Password:

} Thiết lập URL bắt đầu kiểm thử ứng dụng Như với tất dự án ví dụ, dùng Visual Studio để bắt đầu với URL gốc cho ứng dụng đoán URL dựa tập tin chỉnh sửa Chọn lọc Properties từ menu Project Studio Visual, chuyển sang tab Web kiểm tra tùy chọn trang cụ thể phần Bắt đầu hành động Bạn không cần phải cung cấp giá trị Chỉ cần kiểm tra tùy chọn đủ Nếu bạn bắt đầu ứng dụng ví dụ, bạn nhận phản ứng thể hình 18-1 Figure 18-1 Running the example application Sử dụng lọc Bạn thấy ví dụ lọc Chương 12, áp dụng ủy quyền cho phương pháp hành động điều khiển quản trị SportsStore Tôi muốn phương pháp hành động sử dụng người dùng xác thực thân, trình bày cho tơi với lựa chọn phương pháp tiếp cận Tơi kiểm tra tình trạng ủy quyền yêu cầu phương pháp hành động, thể Liệt kê 18-5 Listing 18-5 Kiểm tra cách rõ ràng phương pháp Authorization Action namespace SportsStore.WebUI.Controllers { public class AdminController : Controller { // instance variables and constructor public ViewResult Index() { if (!Request.IsAuthenticated) { FormsAuthentication.RedirectToLoginPage(); } // rest of action method } public ViewResult Create() { if (!Request.IsAuthenticated) { FormsAuthentication.RedirectToLoginPage(); } // rest of action method } public ViewResult Edit(int productId) { if (!Request.IsAuthenticated) { FormsAuthentication.RedirectToLoginPage(); } // rest of action method } // other action methods } } You can see that there is a lot of repetition in this approach, which is why I decided to use a filter instead, as shown in Listing 18-6 Listing 18-6 Applying a Filter namespace SportsStore.WebUI.Controllers { [Authorize] public class AdminController : Controller { // instance variables and constructor public ViewResult Index() { // rest of action method } public ViewResult Create() { // rest of action method } public ViewResult Edit(int productId) { // rest of action method } // other action methods } } Bộ lọc thuộc tính NET mà thêm bước bổ sung cho đường ống xử lý yêu cầu Tôi sử dụng lọc Authorize Liệt kê 18 6, có tác dụng tương tự tất kiểm tra trùng lặp Liệt kê 18-5 Giới thiệu loại Lọc Các MVC Framework hỗ trợ năm loại khác lọc Mỗi phép bạn giới thiệu logic điểm khác trình xử lý yêu cầu Các loại lọc mô tả Bảng 18-2 Table 18-2 MVC Framework Filter Types Trước MVC Framework gọi hành động, kiểm tra định nghĩa phương pháp để xem có thuộc tính mà thực giao diện liệt kê Bảng 18-2 Nếu vậy, thời điểm thích hợp q trình xử lý u cầu, phương pháp xác định giao diện gọi Khung bao gồm lớp thuộc tính mặc định mà thực giao diện lọc Tôi cho bạn thấy làm để sử dụng lớp mặc định sau chương Mẹo MVC giới thiệu giao diện mới, IoverrideFilter, mà mô tả Overriding lọc phần sau chương Lớp ActionFilterAttribute thực hai giao diện IActionFilter IResultFilter Lớp trừu tượng, mà buộc bạn phải cung cấp thực Các lớp AuthorizeAttribute HandleErrorAttribute có tính hữu ích sử dụng mà không cần tạo lớp dẫn xuất Áp dụng lọc để điều khiển phương pháp hành động Bộ lọc áp dụng cho phương pháp hành động cá nhân toàn điều khiển Trong Liệt kê 186, áp dụng lọc để Authorize lớp AdminController, có tác dụng tương tự áp dụng vào phương pháp hành động điều khiển, Ví dụ 18-7 Listing 18-7 Applying a Filter to Action Methods Individually namespace SportsStore.WebUI.Controllers { public class AdminController : Controller { // instance variables and constructor [Authorize] public ViewResult Index() { // rest of action method } [Authorize] public ViewResult Create() { // rest of action method } // other action methods } } Bạn áp dụng nhiều lọc pha trộn kết hợp mức độ mà chúng áp dụng, là, cho dù chúng áp dụng để điều khiển phương pháp hành động cá nhân Liệt kê 18-8 cho thấy ba lọc khác sử dụng Listing 18-8 Applying Multiple Filters in a Controller Class [Authorize(Roles="trader")] // applies to all actions public class ExampleController : Controller { [ShowMessage] [OutputCache(Duration=60)] // public ActionResult Index() { // action method body } // applies to just this action applies to just this action } Một số lọc bảng liệt kê lấy thông số Tôi cho bạn thấy làm công việc mô tả loại khác lọc Lưu ý Nếu bạn xác định lớp sở tùy chỉnh cho điều khiển bạn, lọc áp dụng cho lớp sở ảnh hưởng đến lớp học có nguồn gốc Sử dụng Bộ lọc Authorization/ cho phép Bộ lọc cho phép chạy sau lọc xác thực, trước lọc hành động trước phương pháp hành động gọi Như tên cho thấy, lọc thực thi sách cấp phép bạn, đảm bảo phương pháp hành động gọi người sử dụng phê duyệt Có mối quan hệ có phần liên quan việc xác thực ủy quyền lọc dễ dàng để g iải thích bạn hiểu cách ủy quyền lọc làm việc Tơi giải thích mối quan hệ Sử dụng Bộ lọc xác thực phần sau chương Bộ lọc ủy quyền thực giao diện IAuthorizationFilter, thể Liệt kê 18-9 Listing 18-9 The IAuthorizationFilter Interface namespace System.Web.Mvc { public interface IAuthorizationFilter { 10 public filterContext){ } } } virtual void OnResultExecuted(ResultExecutedContext Lợi ích để sử dụng lớp bạn không cần phải ghi đè lên thực phương pháp mà bạn khơng có ý định sử dụng Nếu khơng, khơng có lợi việc thực giao diện lọc trực tiếp Để chứng minh cho việc sử dụng lớp ActionFilterAttribute, thêm tập tin gọi lớp ProfileAllAttribute.cs vào thư mục sở hạ tầng dự án ví dụ sử dụng để xác định lớp thể Liệt kê 18-40 Listing 18-40 The Contents of the ActionFilterAttribute.cs File using System.Diagnostics; usingSystem.Web.Mvc; namespace Filters.Infrastructure{ public class ProfileAllAttribute : ActionFilterAttribute { private Stopwatchtimer; public override void OnActionExecuting(ActionExecutingContext filterContext){ timer =Stopwatch.StartNew(); } public override void OnResultExecuted(ResultExecutedContext filterContext){ timer.Stop(); filterContext.HttpContext.Response.Write( string.Format("Total elapsed time: {0:F6}", timer.Elapsed.TotalSeconds)); } } } Lớp ActionFilterAttribute sung giao IActionFilter IResultFilter, có nghĩa MVC Framework đối xử với lớp thừa hai loại lọc, chí tất phương pháp ghi đè Trong ví dụ này, tơi thực phương pháp OnActionExecuting từ giao diện IActionFilter phương pháp OnResultExecuted từ giao diện IResultFilter Điều cho phép để tiếp tục profiling chủ đề đo thời gian cần cho phương pháp hành động để thực kết xử lý đơn vị Liệt kê 18-41 cho thấy cách áp dụng lọc để điều khiển Home Listing 18-41 Applying the Filter in the HomeController.cs File [ProfileAction] [ProfileResult] [ProfileAll] public string FilterTest(){ return "This is the FilterTestaction"; } 44 You can see the effect of all of these filters if you start the application and navigate to the /Home/FilterTest method Figure 18-10 shows theresult 45 Figure 18-10 The effect of adding the ProFileAllfilter Using Other Filter Features Các ví dụ trước đưa cho bạn tất thông tin mà bạn cần để làm việc hiệu với lọc Trong phần sau, cho bạn số MVC Framework khả lọc tiên tiến, mà thú vị không sử dụng rộng rãi Filtering WithoutAttributes Theo cách thông thường việc sử dụng lọc để áp dụng thuộc tính, tơi trình bày phần trước Tuy nhiên, có thay Lớp điều khiển bổ sung giao IAuthenticationFilter, IAuthorizationFilter, IActionFilter, IResultFilter, IExceptionFilter Nó cung cấp cài ảo trống phương pháp On XXX bạn nhìn thấy, chẳng hạn OnAuthorization OnException Trong Liệt kê 18-42 cập nhật điều khiển Home để sử dụng tính tạo lớp điều khiển tự profiling Listing 18-42 Using the Controller Filter Methods in the HomeController.cs File usingSystem; usingSystem.Diagnostics; usingSystem.Web.Mvc; usingFilters.Infrastructure; namespace Filters.Controllers{ public class HomeController : Controller{ private Stopwatchtimer; [Authorize(Users = "admin")] public string Index(){ return "This is the Index action on the Homecontroller"; } [GoogleAuth] [Authorize(Users = "bob@google.com")] public string List(){ return "This is the List action on the Homecontroller"; } [HandleError(ExceptionType = typeof(ArgumentOutOfRangeException), View ="RangeError")] 46 public string RangeTest(int id) { if (id >100){ return String.Format("The id value is: {0}",id); } else{ throw new ArgumentOutOfRangeException("id", id,""); } } public string FilterTest(){ return "This is the FilterTestaction"; } protected override void OnActionExecuting(ActionExecutingContext filterContext){ timer =Stopwatch.StartNew(); } protected override void OnResultExecuted(ResultExecutedContext filterContext){ timer.Stop(); filterContext.HttpContext.Response.Write( string.Format("Total elapsed time: {0}", timer.Elapsed.TotalSeconds)); } } } Tôi gỡ bỏ lọc từ phương pháp hành động FilterTest họ khơng cần thiết Bộ điều khiển Home thêm thông tin hồ sơ để đáp ứng cho phương pháp hành động Hình 18-11 cho thấy tác dụng khởi động ứng dụng điều hướng đến / Home / RangeTest / 200 URL, mà mục tiêu hành động RangeTest mà không gây ngoại lệ thiết lập để chứng minh lọc HandleError Figure 18-11 The effect of implementing filter methods directly in thecontroller Kỹ thuật hữu ích bạn tạo lớp sở mà từ nhiều điều khiển dự án bạn có nguồn gốc Điểm tồn lọc đặt mã cần thiết ứng dụng địa điểm tái sử dụng, nên sử dụng phương thức lớp học khơng sử dụng sở cho điều khiển khơng có ý nghĩa nhiều Mẹo Tơi thích sử dụng thuộc tính Tơi thích tách biệt điều khiển logic logic lọc Nếu bạn tìm kiếm cách để áp dụng lọc để tất điều khiển bạn, tiếp tục đọc để xem làm để làm điều với lọc toàn cầu Using GlobalFilters 47 Bộ lọc toàn cầu áp dụng cho tất phương pháp hành động tất điều khiển ứng dụng bạn Có quy ước cho việc thiết lập lọc toàn cầu, tạo Visual Studio tự động bạn sử dụng dự án mẫu MVC mà phải thiết lập lên tay với template Empty Cấu hình ứng dụng rộng thực lớp học thêm vào thư mục App_Start, lý xác định tuyến đường Chương 15 16 / RouteConfig.cs tập App_Start Để tạo tương đương cho lọc, thêm tệp lớp gọi FilterConfig.cs vào thư mục App_Start với nội dung hiển thị Liệt kê 18-43 Listing 18-43 The Content of the FilterConfig.cs File using System.Web; usingSystem.Web.Mvc; namespace Filters{ public class FilterConfig{ public static void RegisterGlobalFilters(GlobalFilterCollection filters){ filters.Add(newHandleErrorAttribute()); } } } Đây nội dung mà Visual Studio tạo cho mẫu MVC Lớp FilterConfig định nghĩa phương pháp gọi tĩnh RegisterGlobalFilters tiếp nhận sưu tập lọc toàn cầu, thể đối tượng GlobalFilterCollection, mà lọc thêm vào Có hai cơng ước để lưu ý tập tin Việc lớp FilterConfig định nghĩa lọc khơng gian tên khơng Filters.App_Start, Visual Studio sử dụng tạo file Thứ hai lọc HandleError, mà mô tả chương trước, luôn xác định lọc toàn cầu cách gọi phương thức Add vào đối tượng GlobalFilterCollection Chú ý Bạn không cần phải thiết lập lọc HandleError tồn cầu, định nghĩa MVC sách ngoại lệ xử lý mặc định Điều làm cho xem /Views/Shared/Error.cshtml có lỗi phát sinh Chính sách xử lý ngoại lệ tắt theo mặc định để phát triển Xem phần "Tạo Bộ lọc Exception" trước chương để lưu ý làm để kích hoạt file Web.config Tơi áp dụng lọc ProfileAll tơi tồn cầu sử dụng gọi phương pháp thiết lập HandleError lọc, thể Liệt kê 18-44 Listing 18-44 Adding a Global Filter to the FilterConfig.cs File using System.Web; usingSystem.Web.Mvc; usingFilters.Infrastructure; namespace Filters{ public class FilterConfig{ public static void RegisterGlobalFilters(GlobalFilterCollection filters){ filters.Add(newHandleErrorAttribute()); filters.Add(newProfileAllAttribute()); } } } 48 Thông báo mẹo mà đăng ký lọc toàn cầu cách tạo thể lớp lọc, có nghĩa tơi cần phải tham khảo tên lớp, có hậu tố thuộc tính Quy tắc bạn bỏ qua thuộc tính áp dụng lọc thuộc tính, kèm theo trực tiếp tạo thể lớp học Bước để đảm bảo phương pháp FilterConfig.RegisterGlobalFilters gọi từ Tập tin Global.asax ứng dụng bắt đầu Bạn thấy ngồi tơi thực cho tập tin Liệt kê 18-45 Listing 18-45 Setting Up Global Filters in the Global.asax File usingSystem; using System.Collections.Generic; usingSystem.Linq; using System.Web; usingSystem.Web.Mvc; usingSystem.Web.Routing; namespace Filters{ public class MvcApplication : System.Web.HttpApplication { protected void Application_Start(){ AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); } } } Để chứng minh lọc tồn cầu, tơi tạo điều khiển gọi khách hàng, thể Liệt kê 18-46 Tôi tạo điều khiển tơi muốn sử dụng mã mà không trước áp dụng lọc Listing 18-46 The Contents of the CustomerController.cs File usingSystem.Web.Mvc; namespace Filters.Controllers{ public class CustomerController : Controller{ public string Index(){ return "This is the Customercontroller"; } } } Đây điều khiển đơn giản mà hành động Index trả chuỗi Hình 18-12 minh họa tác dụng 49 lọc tồn cầu, mà tơi đạt cách bắt đầu ứng dụng điều hướng đến URL / khách hàng Mặc dù không áp dụng lọc trực tiếp với điều khiển, lọc toàn cầu cho biết thêm thơng tin profiling thể hình Figure 18-12 The Effect of a GlobalFilter Ordering FilterExecution 50 Tôi giải thích lọc thực theo loại Trình tự lọc xác thực, lọc ủy quyền, lọc hành động, sau kết lọc Các khuôn khổ thực lọc ngoại lệ giai đoạn có ngoại lệ unhandled Tuy nhiên, nhóm loại, bạn kiểm soát thứ tự mà lọc cá nhân sử dụng Bảng liệt kê 18-47 cho thấy tập tin gọi lớp SimpleMessageAttribute.cs mà thêm vào thư mục sở hạ tầng để xác định lọc đơn giản để chứng minh đặt hàng thực lọc Listing 18-47 The Contents of the SimpleMessageAttribute.cs File usingSystem; usingSystem.Web.Mvc; namespace Filters.Infrastructure { [AttributeUsage(AttributeTargets.Method,AllowMultiple =true)] public class SimpleMessageAttribute : FilterAttribute, IActionFilter { public string Message { get; set;} public void OnActionExecuting(ActionExecuti ngContext filterContext){ filterContext.HttpContext.Response.Write( string.Format("[Before Action: {0}]",Message)); } public void OnActionExecuted(ActionExecutedContextfilterContex t) { filterContext.HttpContext.Response.Write( string.Format("[After Action: {0}]",Message)); } } } Bộ lọc viết thông báo để phản ứng OnActionExecuting phương pháp OnActionExecuted gọi, phần số xác định cách sử dụng tài sản nhắn (mà thiết lập áp dụng lọc) Tôi áp dụng nhiều trường hợp lọc để phương pháp hành động, thể Liệt kê 18-48 (Chú ý thuộc tính AttributeUsage Liệt kê 18-47, tơi thiết lập thuộc tính AllowMultiple true) Listing 18-48 Applying Multiple Filters to an Action in the CustomerController.cs File usingSystem.Web.Mvc; 51 usingFilters.Infrastructure; namespace Filters.Controllers{ public class CustomerController : Controller{ [SimpleMessa ge(Message=" A")] [SimpleMessa ge(Message=" B")] public string Index(){ return "This is the Customercontroller"; } } } Tôi tạo hai lọc với thơng điệp khác nhau: có thơng điệp A, người có thơng điệp B Tơi sử dụng hai lọc khác nhau, cách tiếp cận cho phép để chứng minh bạn cấu hình lọc tồn cầu thơng qua thuộc tính Khi bạn chạy ứng dụng điều hướng đến / URL khách hàng, bạn thấy kết hiển thị hình 18-13 Figure 18-13 Multiple filters on the same actionmethod Các MVC Framework thực lọc B trước lọc A, cách khác xung quanh Các MVC Framework không đảm bảo đơn đặt hàng thực cụ thể Hầu hết thời gian, thứ tự không quan trọng Khi nó, bạn sử dụng tài sản theo thứ tự, Liệt kê 18-49 Listing 18-49 Using the Order Property in a Filter 52 usingSystem.Web.Mvc; usingFilters.Infrastructure; namespace Filters.Controllers{ public class CustomerController : Controller{ [SimpleMessage(Message = "A", Order = 1)] [SimpleMessage(Message = "B", Order = 2)] public string Index(){ return "This is the Customercontroller"; } } } Tham số thứ tự phải giá trị int, MVC Framework thực lọc thứ tự tăng dần Trong danh sách, cho A lọc giá trị thấp nhất, khn khổ thực đầu tiên, thể hình 18-14 Figure 18-14 Specifying the order of filterexecution Chú ý Chú ý phương pháp OnActionExecuting thực theo thứ tự định, phương pháp OnActionExecuted thực theo thứ tự ngược lại Các MVC Framework xây dựng lên đống lọc thực trước phương pháp hành động, sau tách ngăn xếp sau Hành vi ươm thay đổi Nếu không định giá trị cho thuộc tính thứ tự, gán giá trị mặc định -1 Điều có nghĩa bạn kết hợp lọc để số có giá trị đơn hàng người khác khơng, người khơng có giá trị thực đầu tiên, kể từ họ có giá trị hàng thấp 53 Nếu có nhiều lọc loại (nói, lọc hành động) có giá trị hàng (nói 1), sau MVC Framework xác định thứ tự thực dựa nơi lọc áp dụng Bộ lọc tồn cầu thực đầu tiên, sau lọc áp dụng cho lớp điều khiển, sau lọc để áp dụng phương pháp hành động Chú ý thứ tự thực đảo ngược cho lọc ngoại lệ Nếu lọc ngoại lệ áp dụng với giá trị theo thứ tự với điều khiển phương thức hành động, lọc phương pháp hành động thực Bộ lọc ngoại lệ toàn cầu với giá trị hàng tương tự thực thi cuối OverridingFilters Sẽ có lúc bạn muốn áp dụng lọc toàn cầu cấp điều khiển, sử dụng lọc khác cho phương pháp hành động cụ thể Để chứng minh tơi có nghĩa là, tơi cập nhật lọc SimpleMessage để áp dụng cho tồn điều khiển, thể Liệt kê 18-50 Listing 18-50 Adding Controller-Level Application in the SimpleMessageAttribute.cs File usingSystem; using System.Collections.Ge neric; usingSystem.Linq; using Syste m.Web ; using Syste m.Web Mvc; namespace Filters.Infrastructure{ [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple =true)] public class SimpleMessageAttribute : FilterAttribute, IActionFilter { public string Message { get; set;} public void OnActionExecuting(ActionExecuti ngContext filterContext){ filterContext.HttpContext.Response.Write( string.Format("[Before Action: {0}]",Message)); } 54 public void OnActionExecuted(ActionExecutedContextfilterContex t) { filterContext.HttpContext.Response.Write( string.Format("[After Action: {0}]",Message)); } } } Sự thay đổi có nghĩa lọc áp dụng cho phương pháp hành động cá nhân toàn lớp điều khiển Trong Liệt kê 18-51, bạn thấy thay đổi cách mà lọc áp dụng cho điều khiển khách hàng Listing 18-51 Updating the CustomerController.csFile usingSystem.Web.Mvc; usingFilters.Infrastructure; namespace Filters.Controllers{ [SimpleMessage(Message ="A")] public class CustomerController : Controller{ public string Index(){ return "This is the Customercontroller"; } [SimpleMessage(Me ssage = "B")] public string OtherAction(){ return "This is the Other Action in the Customercontroller"; } } } Tôi áp dụng lọc để SimpleMessage lớp điều khiển, có nghĩa thông điệp A bổ sung vào phản ứng phương pháp hành động gọi Tôi thêm phương pháp OtherAction, mà áp dụng lọc SimpleMessage lần nữa, lần với thông điệp B Vấn đề là, theo mặc định, phương pháp OtherAction bị ảnh hưởng hai ứng dụng lọc: điều khiển phương pháp cấp Bạn xem cách hoạt động cách khởi động ứng dụng điều hướng đến / khách hàng / OtherAction, thể hình 18-15 55 Figure 18-15 The default filterbehavior Nếu bạn muốn phương pháp hành động để bị ảnh hưởng lọc áp dụng trực tiếp vào nó, sau bạn sử dụng lọc ghi đè Điều nói với MVC Framework để bỏ qua lọc quy định cấp cao hơn, chẳng hạn điều khiển toàn cầu Ghi đè lọc thuộc tính mà thực giao diện IOverrideFilter, thể Liệt kê 18-52 Listing 18-52 The IOverrideFilterinterface namespace System.Web.Http.Filters{ public interface IOverrideFilter : IFilter{ Type FiltersToOverride { get;} } } Phương pháp FiltersToOverride trả kiểu lọc ghi đè Tơi quan tâm đến lọc hành động cho ví dụ để kết thúc mà tạo CustomOverrideActionFiltersAttribute.cs tập tin sở hạ tầng Như Liệt kê 18-53 cho thấy, thực phương pháp FiltersToOverride để thuộc tính tơi ghi đè loại IActionFilter Chú ý Các MVC Framework kèm với số xây dựng ghi đè lọc System.Web.Mvc.Filters namespace: OverrideAuthenticationAttribute, OverrideActionFiltersAttribute, Khi viết này, lọc không làm việc Điều họ có nguồn gốc từ thuộc tính khơng FilterAttribute Tơi cho điều giải thông cáo sau này, chờ đợi, bạn nên tạo lọc override tùy chỉnh thuộc tính tơi chứng minh Listing 18-53 The Contents of the CustomOverrideActionFiltersAttribute.csFile usingSystem; usingSystem.Web.Mvc; 56 using System.Web.Mvc.Filters; namespace Filters.Infrastructure{ [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple =false)] public class CustomOverrideActionFiltersAttribute : FilterAttribute, IOverrideFilter{ public Type FiltersToOverride{ get { return typeof(IActionFilter);} } } } I can apply this filter to my controller to prevent the global and controller level action filters from taking effect, as shown in Listing18-54 Listing 18-54 Applying a Filter Override in the CustomerController.cs File usingSystem.Web.Mvc; usingFilters.Infrastructure; namespace Filters.Controllers { [SimpleMessage(Message ="A")] public class CustomerController : Controller{ public string Index(){ return "This is the Customercontroller"; } [CustomOverrideActio nFilters] [SimpleMessage(Messa ge = "B")] public string OtherAction(){ return "This is the Other Action in the Customercontroller"; 57 } } } As Figure 18-16 shows, only the SimpleMessage attribute which I have applied directly to theOtherAction method isrun Figure 18-16 The effect of overriding actionfilters Summary Trong chương này, bạn thấy cách đóng gói logic địa quan tâm xuyên suốt lọc Tôi cho bạn loại khác lọc có sẵn làm để thực người Bạn thấy lọc áp dụng thuộc tính để điều khiển phương pháp hành động, làm họ áp dụng lọc toàn cầu Bộ lọc phương tiện để mở rộng logic áp dụng yêu cầu xử lý, mà không cần phải bao gồm mà logic phương pháp hành động Trong chương tiếp theo, cho bạn làm để thay đổi mở rộng cách mà MVC Framework đề với điều khiển 58 ... chuyển đến / Tài khoản / Đăng nhập URL Trong Liệt kê 18- 3, bạn xem nội dung điều khiển tài khoản thêm vào dự án có hành động Login mục tiêu cấu hình định tuyến mặc định Listing 18- 3 Nội dung... thông tin cần thiết Trong Liệt kê 18- 18, bạn nhìn thấy tơi kết hợp GoogleAuth Ủy quyền cho lọc để hạn chế truy cập vào hành động Danh sách điều khiển Home Listing 18- 18 Combining Authentication and... toàn điều khiển Trong Liệt kê 186 , áp dụng lọc để Authorize lớp AdminController, có tác dụng tương tự áp dụng vào phương pháp hành động điều khiển, Ví dụ 18- 7 Listing 18- 7 Applying a Filter to Action

Ngày đăng: 09/11/2019, 08:56