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

时间:2010-09-30 11:44:56

标签: asp.net-mvc exception-handling factory

我有一个带有自定义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;
    }
}

我想知道如何处理此控制器工厂中的异常,以便它们可以像在具有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
);

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

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

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

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

2 个答案:

答案 0 :(得分:2)

也许您可以调整this controller factory来处理异常。

答案 1 :(得分:0)

如果找不到请求的控制器,我会创建一个由控制器工厂调用的错误控制器。然后在其中,覆盖HandleUnknownAction以捕获正在请求的任何操作。

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;
    }
}