Как я могу получить действие контроллера (метод) и тип контроллера, который назовут, дадут 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]
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 #. Ключевой идеей здесь является то, что вы сохраняете его только для первого запроса, поэтому это всегда корневой контроллер.
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);
}
Вы думаете о реализации, подобной этой? Требуются некоторые попытки / уловы!