【问题标题】:Custom ControllerFactory does not replace DefaultControllerFactory when there is a controller collision发生控制器冲突时,自定义 ControllerFactory 不会替换 DefaultControllerFactory
【发布时间】:2013-09-03 20:01:28
【问题描述】:

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

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,它自动使用在(配置指定)区域中定义的控制器(即,如果发生冲突,如上所示,使用区域控制器而不是非区域控制器) .如果该区域不包含匹配的控制器,请退回到不在该区域中的控制器。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    如果在发生名称冲突时默认实现会妨碍您,您也可以直接实现 IControllerFactory 接口而不是扩展 DefaultControllerFactory

    【讨论】:

      猜你喜欢
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多