Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get RouteData by URL?

I need to get RoutData by given URL string in ASP.NET MVC application.

I've found the way that I need to mock HttpContextBase based on my URL string and then pass it to RouteTable.Routes.GetRouteData() method in Route Parsing (Uri to Route) thread.

How to mock HttpContextBase to retrieve RouteData by URL string using RouteTable.Routes.GetRouteData()? Or is there another way to retrieve RouteData by URL?

like image 340
Serge S. Avatar asked Aug 23 '10 07:08

Serge S.


2 Answers

This works for me (.NET 4.5, MVC 5): https://average-joe.info/url-to-route-data/

System.Web.Routing.RouteData routeFromUrl =     System.Web.Routing.RouteTable.Routes.GetRouteData(             new HttpContextWrapper(                 new HttpContext(                     new HttpRequest(null, path, query),                     new HttpResponse(new System.IO.StringWriter())))); 
like image 44
xrasvo Avatar answered Sep 20 '22 13:09

xrasvo


I used Moq to determine what members of HttpContextBase are used in GetRouteData(). They are:

  • Request
    • AppRelativeCurrentExecutionFilePath
    • PathInfo

Request.AppRelativeCurrentExecutionFilePath should return path with ~, what I exactly need, so utility class may be like this one:

public static class RouteUtils {     public static RouteData GetRouteDataByUrl(string url)     {         return RouteTable.Routes.GetRouteData(new RewritedHttpContextBase(url));     }      private class RewritedHttpContextBase : HttpContextBase     {         private readonly HttpRequestBase mockHttpRequestBase;          public RewritedHttpContextBase(string appRelativeUrl)         {             this.mockHttpRequestBase = new MockHttpRequestBase(appRelativeUrl);         }           public override HttpRequestBase Request         {             get             {                 return mockHttpRequestBase;             }         }          private class MockHttpRequestBase : HttpRequestBase         {             private readonly string appRelativeUrl;              public MockHttpRequestBase(string appRelativeUrl)             {                 this.appRelativeUrl = appRelativeUrl;             }              public override string AppRelativeCurrentExecutionFilePath             {                 get { return appRelativeUrl; }             }              public override string PathInfo             {                 get { return ""; }             }         }     } } 

Then, you can use it like this (for example on ~/Error/NotFound):

var rd = RouteUtils.GetRouteDataByUrl("~/Error/NotFound") 

Which should return an object that looks like this:

RouteData.Values {     controller = "Error",     action = "NotFound" } 
like image 101
Serge S. Avatar answered Sep 19 '22 13:09

Serge S.