2010-09-30 20 views
6

Tôi có một 2 ứng dụng ASP.NET MVC với một nhà máy điều khiển StructureMap tùy chỉnh để xử lý dependency injection cho bộ điều khiển của tôi:Làm thế nào để xử lý một ngoại lệ trong một nhà máy điều khiển ASP.NET MVC

public class StructureMapControllerFactory : DefaultControllerFactory 
{ 
    public override IController CreateController(RequestContext context, string controllerName) 
    { 
     Type controllerType = base.GetControllerType(context, controllerName); 
     return ObjectFactory.GetInstance(controllerType) as IController; 
    } 
} 

Tôi muốn để biết làm thế nào tôi có thể xử lý các trường hợp ngoại lệ trong nhà máy điều khiển này để chúng có thể được chuyển hướng đến ~/Views/Shared/Error.aspx giống như cách chúng nằm trong một bộ điều khiển có thuộc tính HandleError. Hiện tại, ngoại lệ không làm điều này mặc dù có thuộc tính CustomErrors được đặt thành "Bật".

Hiện tại tôi có thể tạo ngoại lệ như vậy bằng cách sử dụng URL như "~/DoesNotExist/edit/1". Với tuyến đường mặc định:

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
); 

MVC khớp với tuyến đường này và chuyển tên bộ điều khiển "DoesNotExist" tới nhà máy điều khiển của tôi. GetControllerType sau đó trả về null và gây ra một ngoại lệ tham chiếu null trong lệnh gọi đến StructureMap. Sau đó tôi muốn có thể xử lý ngoại lệ này.

Lưu ý rằng việc thêm lần bắt tiếp theo, tất cả tuyến đường sẽ không giải quyết được sự cố này - MVC khớp với tuyến đường mặc định.

Tôi biết tôi có thể giải quyết vấn đề này bằng cách đặt ràng buộc trên tuyến mặc định cho bộ điều khiển nhưng câu hỏi tổng quát hơn về cách tôi có thể sử dụng MVC ~/Views/Shared/Error.aspx bình thường trong nhà máy.

Lưu ý rằng tôi không muốn câu trả lời yêu cầu khớp nối chặt chẽ của nhà máy bộ điều khiển với ứng dụng MVC cụ thể. Lý tưởng nhất là nhà máy này phải ở trong một hội đồng tham chiếu không có trong cùng một giải pháp.

Trả lời

2

Có thể bạn có thể điều chỉnh this controller factory để xử lý các ngoại lệ.

+0

Vâng, cảm ơn vì đã chỉ cho tôi điều đó - một giải pháp rất hay cho vấn đề. –

0

Tôi sẽ tạo bộ điều khiển Lỗi được gọi bởi nhà máy bộ điều khiển nếu không thể tìm thấy bộ điều khiển được yêu cầu. Sau đó, trong đó, ghi đè lên HandleUnknownAction để nắm bắt bất cứ hành động nào đang được yêu cầu.

public class StructureMapControllerFactory : DefaultControllerFactory 
{ 
    public override IController CreateController(RequestContext context, string controllerName) 
    { 
     Type controllerType = base.GetControllerType(context, controllerName); 

     if (controllerType == null) 
      return ObjectFactory.GetInstance(ErrorController) as IController; 
     else 
      return ObjectFactory.GetInstance(controllerType) as IController; 
    } 
} 
+0

Đúng, điều đó có nghĩa là, mặc dù điều này có nghĩa là lắp ráp với nhà máy cũng cần phải có bộ điều khiển lỗi. Đó không phải là một thảm họa nhưng tôi muốn tách rời những lo ngại nếu tôi có thể. –

+0

Trong các dự án của riêng tôi, tôi chỉ vào bộ điều khiển Home và để cho trình xử lý lỗi ở đó tiếp quản. Không hoàn toàn tách biệt, nhưng có khả năng hầu hết các dự án của bạn sẽ có HomeController. – Clicktricity

+0

Đẹp, vâng, đó là một quy ước khá an toàn –

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