2013-01-24 34 views
0

我有一個MVC應用程序,來填充路由表中有這樣的方法:如何從MVC應用程序之外解析URL路徑

public static void RegisterRoutes(RouteCollection routes){ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    .... 
    routes.MapRoute("default", "{controller}/{action}/{id}", new { controller = "Home", action = "index", id="" }); 
    ... etc 
} 

//and in global.asax it gets called like: 
RegisterRoutes(RouteTable.Routes); 

現在,如果我把從MVC應用程序之外的方法(在一些控制檯應用程序,只是爲了讓路由),我會通過一個新的空集,它將與在MVC應用程序中使用的路線來填充,但有什麼用呢? 我可以只基於路由的收集,認識到給定的控制器名稱,動作及其他參數的網址是什麼? (再次,從Web應用程序的外部)

+2

不是你問這裏完全相信。您可以訪問應用程序之外的任何路線。 –

+0

你是說你想把它添加到MVC應用程序的路由表嗎? – Dhawalk

回答

0

我覺得路線[0] .GetVirtualPath()是你在找什麼。但是,您必須將RequestContext和RouteValueDictionary傳遞給它。如果路由是無法處理您的輸入,它會返回null

+0

它拋出無效的操作異常,並說HttpContex.Current不能爲空。但我沒有HttpContext的,我是從一個控制檯應用程序 – Agzam

+0

你可以嘲笑它,稱它 - http://www.hanselman.com/blog/ASPNETMVCSessionAtMix08TDDAndMvcMockHelpers.aspx。然而,如果你只是試圖從路由中尋找生成的URL,這是一個矯枉過正的行爲。更好的方法恕我直言,是自己寫的替代 –

+0

是的,我已經成功使用從這裏http://forums.asp.net/t/1819622.aspx/1?Using+MVC+Routing+解決嘲笑起來在+ A +主機+應用程序 – Agzam

0

我也希望能夠生成一個控制檯應用程序(站點地圖生成器)從路由集合的網址,並有太多的路線,做簡單的換人。我最後寫一個包裝圍繞UrlHelper.GenerateUrl ...

public class UrlGenerator 
{ 
    protected string Protocol; 
    protected string HostName; 
    protected RequestContext RequestContext; 
    public RouteCollection RouteCollection; 

    public UrlGenerator(string protocol, string hostName, Action<RouteCollection> registerRoutes) 
    { 
     Protocol = protocol; 
     HostName = hostName; 
     RouteCollection = new RouteCollection(); 
     registerRoutes(RouteCollection); 
     // Construct a request context with as little as possible 
     RequestContext = new RequestContext(new HttpContextWrapper(new HttpContext(new HttpRequest(null, "http://x.com", null), new HttpResponse(null))), new RouteData()); 
    } 

    public string GetUrl(string action, string controller, object routeData) 
    { 
     return GetUrl(action, controller, new RouteValueDictionary(routeData)); 
    } 
    public string GetUrl(string action, string controller, RouteValueDictionary routeData) 
    { 
     return UrlHelper.GenerateUrl(null, action, controller, Protocol, HostName, null, routeData, RouteCollection, RequestContext, false); 
    } 
} 

現在你可以做...

UrlGenerator g = new UrlGenerator("https", "myurl.com", RouteConfig.RegisterRoutes); 
Console.WriteLine(g.GetUrl("Index", "Home", new { product = "toad-for-oracle" }));