【问题标题】:ASP.NET MVC C# Get controller and action name in classASP.NET MVC C# 获取类中的控制器和动作名称
【发布时间】:2012-03-23 08:08:14
【问题描述】:

我对 StackOverflow 很陌生,所以请原谅我的无知。 :)

我在 Visual Studio 2010(用 C# 编写的控制器)中的 MVC 应用程序存在一些小问题。 我想创建一个生成应用程序操作历史记录的方法,为此我想获取每次使用的控制器和操作的名称。不幸的是,包含我的控制器名称的字符串的第一个字母总是丢失。 我使用了这段代码:

    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 字符串包含具有以下模式的值: /控制器/动作。

我将不胜感激任何指针、代码示例或解释为什么会发生这种情况。如果我的描述不准确,请告诉我,我会改进它。

提前致谢:)

编辑:找到解决方案:

发现问题(有点):OwnedContext 有问题(在我原来的问题中定义)。起初我按照 HarHaHu 的建议使用 routeValueDictionary,但原来的问题仍然存在,直到我将 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)。

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

【问题讨论】:

  • 是否有机会从 global.asax 发布您的路线定义?显然,从 URL 到路由的某些东西被错误地翻译了。
  • 我的 global.asax 包含使用 MVC3 应用程序模板生成的默认路由

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


【解决方案1】:
var routeValueDictionary = urlHelper.RequestContext.RouteData.Values;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    相关资源
    最近更新 更多