Một số hành động điều khiển của tôi có một bộ hành vi xử lý lỗi tiêu chuẩn. Nói chung, tôi muốn:Tạo ViewResults ngoài Bộ điều khiển trong ASP.NET MVC
- tải một đối tượng dựa trên dữ liệu Route (ID và những thứ tương tự)
- Nếu dữ liệu Route không trỏ đến một đối tượng hợp lệ (ví dụ: thông qua URL hack) sau đó thông báo cho người sử dụng của vấn đề và trả về một HTTP 404 Not Found
- Validate mà người dùng hiện tại có các điều khoản thích hợp trên đối tượng
- Nếu người dùng không được phép, thông báo cho người dùng về sự cố và trả lại HTTP 403 Forbidden
- Nếu điều này thành công, hãy làm điều gì đó với đối tượng cụ thể theo hành động (ví dụ: hiển thị trong chế độ xem).
Các bước này được chuẩn hóa đến mức tôi muốn có mã có thể sử dụng lại để thực hiện hành vi.
kế hoạch hiện tại của tôi về cuộc tấn công là để có một phương pháp helper để làm một cái gì đó như thế này:
public static ActionResult HandleMyObject(this Controller controller,
Func<MyObject,ActionResult> onSuccess) {
var myObject = MyObject.LoadFrom(controller.RouteData).
if (myObject == null) return NotFound(controller);
if (myObject.IsNotAllowed(controller.User)) return NotAllowed(controller);
return onSuccess(myObject);
}
# NotAllowed() is pretty much the same as this
public static NotFound(Controller controller){
controller.HttpContext.Response.StatusCode = 404
# NotFound.aspx is a shared view.
ViewResult result = controller.View("NotFound");
return result;
}
Vấn đề ở đây là Controller.View() là một phương pháp bảo vệ và như vậy là không thể truy cập từ một helper . Tôi đã xem xét việc tạo một thể hiện ViewResult mới một cách rõ ràng, nhưng có đủ thuộc tính để thiết lập rằng tôi cảnh giác về việc làm như vậy mà không biết những cạm bẫy trước tiên.
Cách tốt nhất để tạo ViewResult từ bên ngoài một Bộ điều khiển cụ thể là gì?
+1: Đó là cách tôi sẽ làm. –
Điều tôi không thích về điều này là nó có nghĩa là một bộ điều khiển chỉ có thể có một bộ hành vi hành vi được chia sẻ: mà nó (đơn lẻ) kế thừa. Đối với ví dụ cụ thể này, nó không phải là một vấn đề, nhưng tôi có thể thấy nó khó sử dụng hơn khi dự án phát triển. –
Tôi nhận ra câu hỏi của bạn là năm cũ, nhưng tôi chỉ nghĩ rằng tôi muốn đề cập đến một khả năng khác. Bạn có thể trưng ra một phiên bản công khai của 'View()' được gọi là 'GetView()' trên bộ điều khiển cơ sở của bạn, sau đó bạn có thể giữ helper của bạn trong một lớp riêng biệt. Bạn vẫn sẽ cần phải vượt qua bộ điều khiển của bạn vào helper của bạn, đó là một chút khó xử, nhưng nó cho phép thành phần thay vì thừa kế. – devuxer