当控制器发生冲突时,自定义ControllerFactory不会替换DefaultControllerFactory

时间:2013-09-03 20:01:29

标签: c# asp.net-mvc-4 asp.net-mvc-areas controller-factory

我有一个自定义控制器工厂(与我的问题相关的非常基本的实现):

public class MyControllerFactory : DefaultControllerFactory
{
    public override IController CreateController(RequestContext requestContext, string controllerName)
    {    
        var controller = base.CreateController(requestContext, controllerName);

        return controller;
    }

    protected override System.Web.SessionState.SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, Type controllerType)
    {
        return base.GetControllerSessionBehavior(requestContext, controllerType);
    }
}

global.asax中注册了这样的内容:

protected void Application_Start()
{
    ControllerBuilder.Current.SetControllerFactory(typeof(MyControllerFactory));

    // other code here
}

当解析控制器时没有冲突时,在此控制器工厂中设置的断点被正确命中(例如,在解析过程中只找到一个控制器)。但是,当我有两个具有相同名称的控制器(在我的情况下:一个在区域中,一个不在一个区域中)而不使用路由中的名称空间约束时,我的控制器没有被命中,DefaultControllerFactory接管并抛出(预期)异常。


我的问题

我是否正确注册MyControllerFactory?是否还有其他原因导致我在上面概述的情况下没有使用它?


我正在尝试做什么

我正在尝试编写一个ControllerFactory,它自动使用在(config-specified)区域中定义的控制器(即如果发生冲突,如上所述,请使用区域控制器而不是非区域控制器)。如果该区域不包含匹配的控制器,则回退到不在区域中的控制器。

1 个答案:

答案 0 :(得分:1)

您可以尝试使用全局命名空间优先级。您使用Add ControllerBuilder.Current.DefaultNamespaces方法添加应该赋予更高优先级的命名空间。添加的所有命名空间都具有相同的优先级,您添加它们的顺序无关紧要,但它们的优先级高于未添加的命名空间。因此,您可以使用此方法添加配置指定的命名空间,这应该使它首先在那里搜索。您只需将其添加到Application_Start中,也可以在您的行之后注册您的控制器工厂:

ControllerBuilder.Current.DefaultNamespaces.Add("MyControllerNamespace");

您还可以在命名空间名称后添加“。*”,以便搜索子命名空间。

如果在名称冲突时默认实现受到影响,您也可以直接实现IControllerFactory接口,而不是扩展DefaultControllerFactory