2012-03-05 172 views
5

我对StackOverflow非常新,所以请原谅我的无知迹象。 :)ASP.NET MVC C#获取类中的控制器和动作名称

我有一个在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字符串持有这个模式的值:/ 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有一个自定义的getter:

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

这样,我省略了OwnedContext和终于得到了我的控制者的全名(例如:家具而不是家具)。

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

+0

是否有机会从global.asax发布您的路由定义?很显然,某些东西正在从路由URL中错误转换。 – Dave 2012-03-05 20:48:03

+0

我的global.asax包含了使用MVC3应用程序模板生成的默认路由 – 2012-03-06 13:47:16

回答

4
var routeValueDictionary = urlHelper.RequestContext.RouteData.Values; 

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

相关问题