2012-03-05 1 views
5

Я довольно много нового для StackOverflow, поэтому, пожалуйста, простите любые признаки моего невежества. :)ASP.NET MVC C# Получить контроллер и имя действия в классе

У меня есть небольшая проблема с приложением MVC в Visual Studio 2010 (контроллеры, написанные на C#). Я хочу создать метод, который генерирует историю действий приложения, и для этой цели я хочу получить имя контроллера и действия, которые используются каждый раз. К сожалению, первая буква строки, содержащая мое имя контроллера, всегда отсутствует. Я использовал этот код:

string url = HttpContext.Current.Request.RawUrl; 
    RouteData route = RouteTable.Routes.GetRouteData(new OwnedContext(url)); 
    var values = route.Values; 
    string controllerName = values["controller"].ToString(); 
    string actionName = values["action"].ToString(); 

Где OwnedContext определяется так:

private class OwnedContext : HttpContextBase 
    { 
     private readonly HttpRequestBase mockHttpRequestBase; 

     public OwnedContext(string appRelativeUrl) 
     { 
      this.mockHttpRequestBase = new OwnedRequest(appRelativeUrl); 
     } 

     public override HttpRequestBase Request 
     { 
      get { return mockHttpRequestBase; } 
     } 
    } 

Название действия хранится правильно, но когда я отладка этого кода я вижу, что строка controllerName содержит имя из но первая (Столичная) буква всегда отсутствует, хотя строка url содержит значение с этим шаблоном:/controller/action.

Буду признателен за любые указатели, примеры кода или объяснение, почему это происходит. Если мое описание неточно, дайте мне знать, я улучшу его.

Заранее спасибо :)

EDIT: РЕШЕНИЕ НАЙДЕНО:

Нашло проблему (вроде): Было что-то не так с OwnedContext (определенно в моем первоначальном вопросе). Сначала я использовал RouteValueDictionary, как предложил HarHaHu но исходная проблема сохраняется, пока я не помещается HttpContext в качестве параметра GetRouteData в:

string url = HttpContext.Current.Request.RawUrl; 
    RouteData route = RouteTable.Routes.GetRouteData(httpContext); 
    UrlHelper urlHelper = new UrlHelper(new RequestContext(httpContext, route)); 

    var routeValueDictionary = urlHelper.RequestContext.RouteData.Values; 
    string controllerName = routeValueDictionary["controller"].ToString(); 
    string actionName = routeValueDictionary["action"].ToString(); 

Где HttpContext имеет собственный добытчик:

public new HttpContextBase httpContext 
    { 
     get 
     { 
      HttpContextWrapper context = 
       new HttpContextWrapper(System.Web.HttpContext.Current); 
      return (HttpContextBase)context; 
     } 
    } 

Таким образом, я опустил OwnedContext и наконец, получил полное имя моего диспетчера (например, мебель, а не urniture).

Спасибо за советы. :) Надеюсь, это поможет кому-то. Удачи!

+0

Любой шанс опубликовать определения маршрута из global.asax? Очевидно, что что-то неправильно интерпретируется с URL-адреса маршрута. – Dave

+0

my global.asax содержит маршруты по умолчанию, сгенерированные с помощью шаблона приложения MVC3 –

ответ

4
var routeValueDictionary = urlHelper.RequestContext.RouteData.Values; 

используйте это с вашим пользовательским контекстом.