2010-12-09 86 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初始化它)。

相關問題