Как получить в данный момент исполняемую площадь? - PullRequest
6 голосов
/ 11 декабря 2010

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

То есть:

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

Ответы [ 2 ]

16 голосов
/ 12 декабря 2010

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

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

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

4 голосов
/ 11 декабря 2010

Вы должны иметь возможность получить строку области из 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"];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...