【问题标题】:How do I handle an exception in an ASP.NET MVC controller factory如何处理 ASP.NET MVC 控制器工厂中的异常
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 是的,感谢您指出这一点 - 一个非常好的解决问题的方法。
    【解决方案2】:

    如果找不到请求的控制器,我会创建一个控制器工厂调用的错误控制器。然后在其中覆盖 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;
        }
    }
    

    【讨论】:

    • 是的,就可以了,尽管这确实意味着带有工厂的组件也需要包含错误控制器。这不是一场灾难,但如果可以的话,我想把关注点分开。
    • 在我自己的项目中,我指向 Home 控制器并让那里的错误处理程序接管。不是完全独立的,但可能您的大多数项目都会有一个 HomeController。
    • 很好,是的,这是一个非常安全的约定
    猜你喜欢
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 2014-07-04
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多