2009-05-03 43 views
6

tôi muốn nghe ý kiến ​​của bạn và đề nghị có lẽ tốt hơn cho các tình huống sau:ASP.NET MVC, ActionFilters, các lớp học tĩnh và dữ liệu thông qua xung quanh

Tôi có định nghĩa một ActionFilter tùy chỉnh mà hiện một số công việc và đi ra với một số giá trị. Tôi muốn sử dụng giá trị đó trong các hành động của bộ điều khiển và trong các mô hình.

Bây giờ, tôi có thể sử dụng TempData để chuyển giá trị này từ ActionFilter đến bất kỳ phương thức hành động điều khiển nào, sau đó phân phối giá trị này cho tất cả các mô hình được chuyển đến chế độ xem được trả về.

Tôi chắc chắn rằng nó sẽ làm việc nhưng TempData này sẽ có trong phiên ở đâu và khi không ai thực sự cần nó nữa. Giá trị được cho là được sử dụng độc quyền trong mã trong thời gian của một yêu cầu duy nhất sau khi nó có hiệu lực vô hiệu.

tôi đã đưa ra hai lựa chọn:

  1. Trong ActionFilter, tôi đặt giá trị này trong TempData trong OnActioExecuting() và tôi loại bỏ nó trong OnActionExecuted(). Tôi có hiểu chính xác rằng khi OnActionExecuted được gọi, hành động của bộ điều khiển đã kết thúc, phản hồi đã được tạo ra và nội dung TempData này chưa thực hiện theo cách của nó đến phiên YET không?

  2. Trong bất kỳ lớp tĩnh tùy chỉnh nào của tôi (logic), tôi chỉ xác định thuộc tính công khai cho giá trị này và tôi sử dụng nó bất cứ khi nào cần. Liệu trường tĩnh này không bị mất giữa OnActionExecuting() và thực sự thực thi phương thức điều khiển? Có bất kỳ vấn đề nào khác có thể mất giá trị này trong quá trình xử lý yêu cầu trên máy chủ không?

Có tùy chọn nào khác/tốt hơn tôi chưa được xem xét chưa?

Trả lời

8

Tôi nhận thấy rằng việc sử dụng ActionParameters làm cho mã của bạn dễ dàng kiểm tra được. Bạn có thể làm điều đó như vậy:

// inside your actionfilter 
public override void OnActionExecuting(ActionExecutinContext context) 
{ 
    var someData = // ... load some data 

    context.ActionParameters["someData"] = someData; 
} 


// and then in your action method 
[ProvideSomeData] 
public ViewResult Index(SomeData someData) 
{ 
    // someData will be populated in here 
} 
+0

Khá thú vị. Có phải là các tham số của hàm tạo dựng hành động sẽ tự động được ánh xạ tới các khóa tập hợp ActionParameters không? – User

+0

Có các thông số hành động phải là cách ưu tiên để truyền giá trị trong bộ điều khiển. – kazimanzurrashid

+0

Cuối cùng tôi thích cách tiếp cận này, mặc dù nó chắc chắn từ chối nguyên tắc DRY. Cảm ơn vì tiền hỗ trợ. – User

3

lại: # 2

Chỉ muốn chỉ ra rằng vấn đề với một trường tĩnh là nhiều yêu cầu tất cả sẽ được sử dụng lĩnh vực tĩnh như vậy. Nếu bạn có hai yêu cầu thực thi đồng thời luôn có một cơ hội mà yêu cầu B sẽ ghi đè lên giá trị của yêu cầu A và bạn sẽ sử dụng giá trị sai khi hành động cho yêu cầu A thực hiện.

Tôi muốn tránh sử dụng thành viên tĩnh để giữ thông tin cụ thể về yêu cầu.

+0

Cảm ơn. Tôi sợ một thứ như thế. Vì vậy, các trường tĩnh này được chia sẻ giữa tất cả các yêu cầu và không phải mỗi yêu cầu đều có ngữ cảnh riêng của nó? – User

+2

Các trường và thuộc tính tĩnh công khai hiển thị cho mọi chuỗi trong ứng dụng. – OdeToCode

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