MVC - 在特定情况下使用不同的控制器

时间:2010-12-09 09:53:03

标签: .net asp.net asp.net-mvc

我有一个客户控制器,负责处理客户的产品,信息以及什么不是。有些产品具有我想要处理的特殊化,所以需要一个这样做的过程。目前我在if语句中进行了硬编码,以查看客户是否拥有该产品,如果有,则会添加额外的导航元素等。

我认为可能更好的方法是让Controller继承我的客户控制器,但增加了额外的功能。如果我能够在收到请求后检查哪个Customer派生控制器具有与请求匹配的函数,即ViewSpecialProduct,然后调用该函数而不是vanilla客户控制器,那么它就非常好了。

有更简单的方法吗?如果不是我如何完成上述任务?我对路线和控制器初始化过程还不太了解。

由于

2 个答案:

答案 0 :(得分:1)

您可以创建一个源自DefaultControllerFactory的新控制器工厂,并覆盖GetControllerInstance。我不确定你是如何进行客户检查的,但它可能看起来像这样:

public class CustomControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType == typeof(DefaultProductController))
        {                
            if(// is special customer)
                return new SpecialProductController();
            else
                return new DefaultProductController();
        }
    }
}

然后通过ControllerBuilder.Current在Global.asax Application_Start中设置新的ControllerFactory:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        ControllerBuilder.Current.SetControllerFactory(new CustomControllerFactory());

        RegisterRoutes(RouteTable.Routes);
    }

答案 1 :(得分:0)

由于它在生命周期中的位置,您可能不希望通过路由执行此操作。 MvcContrib具有可用于SubController http://jeffreypalermo.com/blog/mvccontrib-latest-release-now-with-subcontroller-support/的代码。此外,您可以通过将控制器工厂引用注入控制器,或者通过手动创建控制器并返回其操作来创建另一个控制器(但是如果您希望这样做,则必须记住使用ControllerContext对其进行初始化) )。