【发布时间】:2010-09-30 11:44:55
【问题描述】:
我有一个带有自定义 StructureMap 控制器工厂的 ASP.NET MVC 2 应用程序来处理我的控制器的依赖注入:
public class StructureMapControllerFactory : DefaultControllerFactory
{
public override IController CreateController(RequestContext context, string controllerName)
{
Type controllerType = base.GetControllerType(context, controllerName);
return ObjectFactory.GetInstance(controllerType) as IController;
}
}
我想知道如何在这个控制器工厂中处理异常,以便可以将它们重定向到 ~/Views/Shared/Error.aspx,就像它们在具有 HandleError 属性的控制器中一样。尽管将 CustomErrors 属性设置为“On”,但当前异常不会执行此操作。
目前,我可以使用“~/DoesNotExist/edit/1”之类的 URL 生成这样的异常。使用默认路由:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
MVC 匹配此路由并将控制器名称“DoesNotExist”传递给我的控制器工厂。 GetControllerType 然后返回 null 并在对 StructureMap 的调用中导致 null 引用异常。然后我希望能够处理这个异常。
请注意,添加后续的 catch all 路由不会解决此问题 - MVC 匹配默认路由。
我知道我可以通过对控制器的默认路由设置约束来解决这个特殊问题,但问题是关于如何在工厂中使用普通的 MVC ~/Views/Shared/Error.aspx。
请注意,我不希望答案要求将控制器工厂与特定 MVC 应用程序紧密耦合。理想情况下,这个工厂应该在一个引用的程序集中,而不是在同一个解决方案中。
【问题讨论】:
标签: asp.net-mvc exception-handling factory