2012-07-04 2 views
1

У меня есть класс BaseController, на который наследуются все мои контроллеры. Он имеет метод override ExecuteCore, который выполняет некоторую начальную настройку, необходимую для (почти) всех контроллеров и их действий.Определить, какой контроллер/действие вызывается в ExecuteCore

protected override void ExecuteCore() 
    { 
     SetUpMethod1(); 
     SetUpMethod2(); 
     base.ExecuteCore(); 
    } 

    protected virtual void SetUpMethod1() 
    { 
     //some initialization stuff 
    } 

    protected virtual void SetUpMethod2() 
    { 
     //some other initialization stuff 
    } 

В случае, когда некоторый контроллер нуждается в некотором другое поведении, легко переопределить соответствующий метод в контроллере, и работает хорошо. Тем не менее, есть несколько действий от разных контроллеров, которые нуждаются в несколько другом поведении в методах настройки.

Я придумал

protected virtual void SetUpMethod1() 
    { 
     string controller = (string)ControllerContext.RouteData.Values["controller"]); 
     string action = (string)ControllerContext.RouteData.Values["action"]); 
     if (controller/account combination is in a list) 
      //special setup 
     else 
      //regular setup 
    } 

Я не могу избавиться от ощущения, что я делаю что-то неправильно. Есть ли лучший/правильный способ получить это поведение?

+0

У вас есть разрешение в вашей системе? –

+0

@alok_dida: да, разрешение не является проблемой. – SWeko

+0

см. Мой ниже ответ. –

ответ

1

Добавить новый атрибут

public sealed class SpecialSetUpAttribute : Attribute 
{ 
} 

Я определил два контроллера, в котором я определил этот атрибут для одного контроллера, а не для других. См. Ниже код.

BasicController

public class BasicController : BaseController 
    { 
     // 
     // GET: /Basic/ 

     public ActionResult Index() 
     { 
      return View(); 
     } 

} 

Специальный контроллер установки

[SpecialSetUp] 
public class HomeController : BaseController 
{ 

} 

Оба контроллера происходит от BaseController. См. Код для BaseController.

public class BaseController : Controller 
     { 
      protected override void ExecuteCore() 
      { 
       Type controllerType = this.ControllerContext.Controller.GetType(); 
       ControllerDescriptor controllerDescriptor = new ReflectedControllerDescriptor(controllerType); 

// Edit start 
       string actionName = Convert.ToString(this.ControllerContext.RouteData.Values["action"]); 
      string controller = Convert.ToString(this.ControllerContext.RouteData.Values["controller"]); 

// Edit end 

       if (controllerDescriptor.IsDefined(typeof(SpecialSetUpAttribute), true)) 
       { 
        //Do special setup 
       } 
       else 
       { 
        //Do normal setup 
       } 
       base.ExecuteCore(); 
      } 
     } 

При запуске приложения для BasicController он выполнит обычный установочный код. Когда вы запустите приложение для HomeController, он выполнит специальный код установки. Я реализовал этот код для уровня контроллера. Вы также можете сделать что-то для уровня действия.

+0

Ницца, решение, но как я могу получить название действия? – SWeko

+0

@SWeko. Я обновил код для этого. Для этого см. Код BaseController. (Редактировать конец и начать.) –

0

Я бы пошел в несколько другом направлении.

Вместо того, чтобы иметь if-statement, у меня было бы 2 базовых класса: BaseForSetup1Controller, BaseForSetup2Contoller.

Так,

public class UsingSetup1Controller : BaseForSetup1Controller {} 

и

public class UsingSetup2Controller : BaseForSetup2Controller {} 

Чуть дальше: Я предпочитаю использовать фильтры вместо инициализации базового класса. Таким образом, вы можете создать несколько фильтров инициализации (фильтры действий, которые используют метод OnActionExecuting), и применять их на контроллерах по мере необходимости.

[Setup1Initialization] 
public class UsingSetup1Controller { } 

[Setup2Initialization] 
public class UsingSetup2Controller { } 
+0

В случае ifs принимаются только некоторые действия на некоторых контроллерах. Я не хочу, чтобы весь контроллер имел другое поведение (тогда я могу переопределить методы), мне просто нужно другое поведение для определенных действий. – SWeko

+0

Опять же, вы можете применить фильтр к действию с определенным поведением. –

+0

Отдельные базовые классы не будут делать трюк, так как большинство контроллеров требуют обеих настроек. – SWeko

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