ASP.NET MVC C#在类中获取控制器和操作名称

时间:2012-03-05 20:41:07

标签: c# asp.net-mvc http-get asp.net-mvc-controller

我对StackOverflow很新,所以请原谅我无知的任何迹象。 :)

我在Visual Studio 2010中使用MVC应用程序(用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字符串包含控制器的名称,但第一个(Capital)字母始终缺失,即使url字符串包含具有此模式的值: /控制器/动作。

我会感谢任何指针,代码示例或解释为什么会发生这种情况。如果我的描述不准确让我知道,我会改进它。

提前致谢:)

编辑:解决方案:

发现问题(某种程度):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有自定义getter:

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

这样我省略了OwnedContext并最终获得了我的控制器的全名(例如:Furniture而不是urniture)。

感谢您的提示。 :) 希望这有助于某人。祝你好运!

1 个答案:

答案 0 :(得分:4)

var routeValueDictionary = urlHelper.RequestContext.RouteData.Values;

将此与您的自定义上下文一起使用。