2011-07-03 27 views
40

Trong MVC chúng ta có thể trang trí các phương pháp hành động với các bộ lọc khác nhau nhưTrong thứ tự nào được thực hiện trong các bộ lọc asp.net MVC

[HttpPost] 
[Authorize] 
public ActionResult mymethod(){} 

HttpPost xuất phát từ MethodSelectorAttribute (có thể là gián tiếp) và thuộc tính Authorize thừa hưởng từ ActionFilterAttribute.

Câu hỏi của tôi là: theo thứ tự nào chúng được thực thi trong đường ống yêu cầu MVC? Tôi đã cố gắng để tìm kiếm trong mã nguồn MVC nhưng không tìm thấy các bit mã có liên quan.

+0

Tôi giả định thứ tự mà chúng được trả lại trong khi phản ánh có thể bị ảnh hưởng bởi thứ tự thực tế trong nguồn. –

+0

@Hasan bhai đầu tiên của tất cả các tốt đẹp để xem bạn sau đó tôi tin rằng HttpPost là actionmethodSelector (phương pháp của nó isValidForRequest được gọi là) thuộc tính và Authorize là actionFilter thuộc tính (onActionExecuting của nó hoặc onActionExecuted được gọi) để họ phải được gọi tại thời điểm khác nhau. có lẽ HttpPost nên được gọi trước khi ủy quyền bởi vì chúng là các bộ lọc khác nhau và có trách nhiệm khác nhau. –

+0

Dường như giả định của tôi sai. Câu trả lời của Eranga cho thấy rằng Bộ lọc có một cơ chế để xác định thứ tự của chúng. Tuy nhiên, vì HttpPost không phải là một bộ lọc khi nó xuất hiện. Nó có thể xử lý đặc biệt có lẽ bằng cách thực hiện nó trước bất cứ điều gì khác. Một lần nữa một giả định của nó. –

Trả lời

60

lọc chạy theo thứ tự sau:

  1. lọc Authorization
  2. lọc hành động
  3. bộ lọc đáp ứng
  4. lọc Exception

Ví dụ, bộ lọc cho phép chạy đầu tiên và bộ lọc ngoại lệ chạy cuối cùng. Trong mỗi loại bộ lọc, giá trị Đơn đặt hàng chỉ định thứ tự chạy. Trong mỗi loại bộ lọc và thứ tự, giá trị điều tra Phạm vi xác định thứ tự cho các bộ lọc. liệt kê này định nghĩa các giá trị sau lọc phạm vi (theo thứ tự, trong đó họ chạy):

  1. Đầu tiên
  2. toàn cầu
  3. khiển
  4. Action
  5. cuối

Trích từ MSDN

+1

HttpPost không phải là bất kỳ bộ lọc được đề cập ở trên nó là MehodSelectorAttribute –

+2

Có nó được sử dụng để chọn phương pháp hành động nếu có nhiều ứng cử viên. Vì vậy, nó là một thuộc tính đánh dấu. Nó được sử dụng trước khi các bộ lọc được thực hiện – Eranga

+1

vui lòng truy cập http://zahidadeel.blogspot.com/2011/07/ajaxonly-attribute-actionfilter-vs.html để biết thêm chi tiết –

19

Để lưu bạn một thời gian, đây là cách bạn thiết lập thứ tự:

[MyCustomContextFilter(Order=1)] 

Chỉ số này được dựa 0, vì vậy bạn có thể làm 0, 1, 2, vv ...

Cần lưu ý rằng chỉ vì bộ lọc nằm trên lớp cơ sở không cho MVC áp dụng nó trước :(.

+2

Các bộ lọc không có thứ tự được chỉ định được chạy trước các bộ lọc có thứ tự. Điều này áp dụng trong bối cảnh loại bộ lọc (ủy quyền, hành động, v.v.). –

+0

NB. Bộ lọc ngoại lệ chạy theo thứ tự ngược lại! (Vâng thật đấy :/) – Haohmaru

Các vấn đề liên quan