Я новичок в StackOverflow, поэтому, пожалуйста, простите меня за любые признаки моего невежества. :)
У меня небольшая проблема с приложением 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.
Буду признателен за любые указатели, примеры кода или объяснения, почему это происходит. Если мое описание не соответствует действительности, дайте мне знать, я исправлю его.
Заранее спасибо :)
РЕДАКТИРОВАТЬ: НАЙДЕНО РЕШЕНИЕ:
Обнаружена проблема (вроде): Что-то не так с 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 и, наконец, получил полное имя моего контроллера (для пример: мебель, а не мебель).
Спасибо за советы. :) Надеюсь, это поможет кому-то. Удачи!