代码之家  ›  专栏  ›  技术社区  ›  Rob West

如何处理ASP.NETMVC控制器厂

  •  6
  • Rob West  · 技术社区  · 15 年前

    我有一个ASP.NET具有自定义StructureMap控制器工厂的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;
        }
    }
    

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

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

    注意,添加一个后续的catch-all路由并不能解决这个问题-MVC匹配默认路由。

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

    2 回复  |  直到 15 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    也许你能适应 this controller factory 处理异常。

        2
  •  0
  •   Clicktricity    15 年前

    我将创建一个错误控制器,如果控制器工厂找不到请求的控制器,它将被调用。然后在这个范围内,重写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;
        }
    }