2010-12-11 3 views
6

У меня есть класс, используемый контроллерами в [Project]. Контроллеры и контроллеры в разных областях. Как я могу определить, где находится контроллер? (Думаю, я мог бы посмотреть на свойства HttpContext.Current.Request, но я ищу «правильный» способ MVC). Спасибо.Как получить в настоящее время область выполнения?

То есть:

[Project].Helpers // called by: 
[Project].Controllers 
[Project].Areas.[Area].Controllers 
// how could I determine the caller from [Project].Helpers? 

ответ

16

Мы целенаправленно не обнаружили способ получить текущее имя области из запроса MVC, так как «a rea "является просто атрибутом маршрута. Это ненадежно для других целей. В частности, если вы хотите, чтобы у ваших контроллеров был некоторый атрибут (подумайте об абстрактном термине, а не в классе System.Attribute), который может использоваться помощником, тогда эти атрибуты должны быть найдены на самих контроллерах, не на области.

В качестве практического примера, если вы хотите, чтобы какая-либо логика (например, фильтр действий) запускалась перед любыми контроллерами в определенной области, вы должны связать фильтр действий с этими контроллерами напрямую. Самый простой способ сделать это - связать некоторый MyAreaBaseController с этим фильтром, а затем каждый контроллер, который вы логически хотите связать с этой областью, чтобы подкласс этого типа. Любое другое использование, такое как глобальный фильтр, который смотрит на RouteData.DataTokens ["area"] для принятия решения, является неподдерживаемым и потенциально опасным.

Если вам действительно нужно получить текущее название области, вы можете использовать RouteData.DataTokens["area"], чтобы найти его.

+0

Привет, Леви, это был отличный ответ спасибо. – 2010-12-17 21:53:35

+1

Замечательно, если вы узнаете об этом в команде .NET. Используется ли ваш ответ, если он находится внутри? У меня есть общий вид, который используется в разных областях, и я хотел бы изменить его внешний вид на основе того, где пользователь находится на сайте. Я мог бы использовать частичный вид, но тогда основной вид был бы почти пустым. Помещение чего-то в ViewBag кажется неправильным, потому что это строго логика представления. –

4

Вы должны быть в состоянии получить строку области от RouteData:

// action inside a controller in an area 
public ActionResult Index() 
{ 
    var area = RouteData.DataTokens["area"]; 
    .... 
    return View(); 
} 

.. так что вы можете сделать метод расширения для помощников, как это:

public static class SomeHelper // in [Project].Helpers 
{ 
    public static string Area(this HtmlHelper helper) 
    { 
     return (string)helper.ViewContext.RouteData.DataTokens["area"]; 
    } 
} 
Смежные вопросы