ASP.NET MVC C # Получить контроллер и имя действия в классе - PullRequest
5 голосов
/ 06 марта 2012

Я довольно новичок в 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 и, наконец, получил полное имя моего контроллера (например: Мебель, а не предметы интерьера).

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

1 Ответ

4 голосов
/ 06 марта 2012
var routeValueDictionary = urlHelper.RequestContext.RouteData.Values;

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

...