2010-12-09 89 views
1

我有一个客户控制器,处理客户产品,信息和不是。有些产品具有我希望处理方式稍有不同的专业化处理,因此需要执行此操作。目前我已在if声明中进行了硬编码,以查看客户是否拥有该产品,如果有,则会添加额外的导航元素等。MVC - 在特定情况下使用不同的控制器

我认为可能更好的方法是拥有继承我的客户控制器但添加额外功能的控制器。如果我能够在收到请求时检查哪个客户派生控制器具有与请求相匹配的功能(即ViewSpecialProduct),然后调用该请求,而不是香草客户控制器,那么它会非常漂亮。

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

感谢

+0

chris,是这些如果**语句**控制器动作的一部分或嵌入视图? – 2010-12-09 10:28:30

+0

嘿吉姆。目前作为控制器的一部分。如果选择某个产品,则创建发送到视图的新导航元素。但是控制它们的功能目前是主控制器的一部分,我觉得它们应该是另一个控制器的一部分? – Chris 2010-12-09 10:40:26

回答

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); 
    } 
0

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

相关问题