2010-12-09 2 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(); 
     } 
    } 
} 

Вы затем установить новый ControllerFactory в Global.asax Application_Start через ControllerBuilder.Current:

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).

Смежные вопросы