Как я могу получить тип контроллера и информацию о действии от URL или от данных маршрутов?

Как я могу получить действие контроллера (метод) и тип контроллера, который назовут, дадут System.Web.Routing.RouteData?

Мой сценарий - это - я хочу смочь сделать, выполняют определенные действия (или не) в OnActionExecuting метод для действия.

Однако я буду часто хотеть знать не текущее действие, но "корневое" называемое действие; этим я подразумеваю, что у меня может быть представление под названием "Вход в систему", который является моей страницей входа в систему. Это представление может включать другое частичное представление "LeftNav". Когда OnActionExecuting требуется LeftNav, я хочу смочь решить, что это действительно называют для "корня" aciton Входа в систему.

Я понимаю это путем вызова RouteTable.Routes.GetRouteData(actionExecutingContext.HttpContext), Я могу получить маршрут для "корневого" запроса, но как превратить это в информацию о типе и метод?

Единственное решение, которое я имею до сих пор, что-то как:

 var routeData = RouteTable.Routes.GetRouteData(actionExecutingContext.HttpContext)
 var routeController = (string)routeData.Values["controller"]; 
 var routeAction = (string)routeData.Values["action"];

Проблема с этим состоит в том, что "routeController" является названием контроллера с суффиксом "Контроллера", удаленным, и не полностью определяется; т.е. это - "Вход в систему", а не "MyCode. Веб-сайт. LoginController".

Я получил бы фактическое Type и MethodInfo если это возможно, или по крайней мере полностью определенное имя типа.

Какие-либо мысли или альтернативные подходы?

[РЕДАКТИРОВАНИЕ - это - ASP.Net MVC 1.0]

11
задан Rob Levine 22 April 2010 в 17:49
поделиться

2 ответа

  protected override void OnActionExecuting(ActionExecutingContext filterContext)
  {
     var type1 = filterContext.Controller.GetType();
     var type2 = filterContext.ActionDescriptor
                    .ControllerDescriptor.ControllerType;
  }

Хорошо, извините, я пропустил "корневую" часть.

Затем, другим способом, вы можете сохранить тип контроллера в хранилище потоков. Псевдокод:

  protected override void OnActionExecuting(ActionExecutingContext filterContext)
  {
     if (!Thread.LocalStorage.Contains("root_controller"))
        Thread.LocalStorage["root_controller"] = 
            filterContext.ActionDescriptor
                    .ControllerDescriptor.ControllerType;
  }

Просто идея. Я уверен, что локальное хранилище потоков доступно на C #. Ключевой идеей здесь является то, что вы сохраняете его только для первого запроса, поэтому это всегда корневой контроллер.

5
ответ дан 3 December 2019 в 10:03
поделиться
public Type ControllerType(string controllerName)
{
   var fullName = controllerName + "Controller";
   var assemblyName = Assembly.GetExecutingAssembly().FullName;
   return Activator.CreateInstance(assemblyName, fullTypeName).GetType();
}

public MethodInfo ActionMethodInfo(string actionName, Type controllerType)
{
   return controllerType.GetMethod(actionName);
}

Вы думаете о реализации, подобной этой? Требуются некоторые попытки / уловы!

1
ответ дан 3 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: