Могу ли я получить контроллер из HttpContext? - PullRequest
41 голосов
/ 14 марта 2011

Учитывая HttpContext (или HttpContextBase), есть ли способ получить экземпляр контроллера?

Ответы [ 4 ]

90 голосов
/ 26 января 2012

Для тех, кто хочет просто получить имя контроллера, а не фактический экземпляр, как это необходимо для пользовательских переопределений авторизации AuthorizeCore (httpContext), это чистый код.

var request = httpContext.Request;
var currentUser = httpContext.User.Identity.Name;
string controller = request.RequestContext.RouteData.Values["controller"].ToString();
string action = request.RequestContext.RouteData.Values["action"].ToString();
31 голосов
/ 14 марта 2011

HttpContext будет содержать ссылку на MvcHandler, которая будет содержать ссылку на RouteData, которая будет содержать ссылку на то, какой контроллер вызывается конкретным маршрутом.

Примечание: Это не дает вам фактический контроллер, только контроллер что конкретный маршрут будет поймать.

GetController(HttpContextBase httpContext)
{
    var routeData = ((MvcHandler)httpContext.Handler).RequestContext.RouteData;

    var routeValues = routeData.Values;
    var matchedRouteBase = routeData.Route;
    var matchedRoute = matchedRouteBase as Route;

    if (matchedRoute != null)
    {
        Route = matchedRoute.Url ?? string.Empty;
    }

    AssignRouteValues(httpContext, routeValues);
}
protected virtual VirtualPathData getVirtualPathData(HttpContextBase httpContext, RouteValueDictionary routeValues)
{
    return RouteTable.Routes.GetVirtualPath(((MvcHandler)httpContext.Handler).RequestContext, routeValues);
}

private void AssignRouteValues(HttpContextBase httpContext, RouteValueDictionary routeValues)
{
    var virtualPathData = getVirtualPathData(httpContext, routeValues);

    if (virtualPathData != null)
    {
        var vpdRoute = virtualPathData.Route as Route;
        if (vpdRoute != null)
        {
            RouteDefaults = vpdRoute.Defaults;
            RouteConstraints = vpdRoute.Constraints;
            RouteDataTokens = virtualPathData.DataTokens;
            RouteValues = routeValues;
        }
    }
}

Этот код может показаться знакомым, потому что я адаптировал его из исходного кода Фила Хаака .

1 голос
/ 14 июля 2016
var currentRouteData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));
var currentController = currentRouteData.Values["controller"].ToString();
var currentAction = currentRouteData.Values["action"].ToString();
1 голос
/ 14 марта 2011

Не легко, вам в основном придется сначала получить MvcHandler из RouteData, а затем собрать контроллер.Даже в этом случае он не предоставит вам экземпляр, используемый для обработки действия, поскольку он будет новым экземпляром контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...