Я довольно много нового для 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).
Спасибо за советы. :) Надеюсь, это поможет кому-то. Удачи!
Любой шанс опубликовать определения маршрута из global.asax? Очевидно, что что-то неправильно интерпретируется с URL-адреса маршрута. – Dave
my global.asax содержит маршруты по умолчанию, сгенерированные с помощью шаблона приложения MVC3 –