如何在ASP.NET MVC控制器工厂中处理异常

Rob*_*est 6 asp.net-mvc factory exception-handling

我有一个带有自定义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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何在这个控制器工厂中处理异常,以便它们可以像在具有HandleError属性的控制器中一样重定向到〜/ Views/Shared/Error.aspx.尽管将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
);
Run Code Online (Sandbox Code Playgroud)

MVC匹配此路由并将控制器名称"DoesNotExist"传递给我的控制器工厂.GetControllerType然后返回null并在对StructureMap的调用中导致空引用异常.然后我希望能够处理这个异常.

请注意,添加后续捕获所有路由将无法解决此问题 - MVC匹配默认路由.

我知道我可以通过在控制器的默认路由上设置约束来解决这个特殊问题,但问题是如何在工厂中使用普通的MVC~/Views/Shared/Error.aspx.

请注意,我不希望答案要求将控制器工厂紧密耦合到特定的MVC应用程序.理想情况下,此工厂应位于不在同一解决方案中的引用程序集中.

Mat*_*caj 2

也许您可以调整这个控制器工厂来处理异常。