2011-02-09 13 views
5

Ho una stringa all'interno dell'azione di uno dei miei controller che rappresenta un URL di riferimento. I dati del percorso della richiesta corrente non sono quello che sto cercando (perché viene chiamato dal tag dello script all'interno di un'altra vista).Come si cerca manualmente una rotta in RouteTable MVC.Net?

Desidero trovare l'azione e il controller per l'Url di riferimento.

C'è un modo per utilizzare manualmente una stringa come "/ Product/23" per trovare il controller e l'azione della stringa come un url produrrebbe?

risposta

8

ho bloggato di fare questa cosa esattamente un paio di settimane fa:

Creating a RouteData instance from a URL

+0

Grazie. Sembra che la chiave sia che devi creare un'implementazione concreta HttpRequestBase. Con questo si trasforma un percorso URI e applicazione in Route. – ctrlShiftBryan

+0

@ctrl e @Scott - Dovrei notare che mentre quel codice * principalmente * funziona, ci sono casi in cui non lo farà. Un vincolo di percorso personalizzato può scegliere di fare ogni sorta di cose pazze e quelle cose pazze potrebbero non funzionare se si tenta di rieseguire la scansione della tabella del percorso. La parte del routing è pensata per essere eseguita solo durante le primissime parti della pipeline di richieste ASP.NET e destinata a essere eseguita una sola volta. Non sto dicendo che non dovresti farlo, ma sto avvertendo che potrebbero esserci casi in cui non funzionerà. – Eilon

+0

Ottimo articolo e ho intenzione di usare il tuo metodo qui su Stack Overflow. Tuttavia, penso che ci sia un bug con '_pathInfo = uri.Query;' - ['PathInfo'] (http://msdn.microsoft.com/en-us/library/system.web.httprequest.pathinfo (v = vs .110) .aspx) sembra essere qualsiasi cosa [tra l'estensione di un URL e il delimitatore '?' Query string] (http://www.nathanaeljones.com/blog/2008/pathinfo-woes), ad esempio 'http: //test.com/page.aspx/path/info? query = 1' avrebbe' PathInfo =/percorso/info'. Avere la query in 'PathInfo' stava causando percorsi non corrispondenti per me. –

4

Se si desidera solo per utilizzare i metodi MVC ho ottenuto questo al lavoro.

  Uri returnUri = new Uri(returnUrl, UriKind.RelativeOrAbsolute); 
      if (!returnUri.IsAbsoluteUri) 
      { 
       returnUri = new Uri("http://localhost" + returnUrl); // localhost used just to get absolute URL 
      } 
      HttpContextWrapper httpContext = new HttpContextWrapper(
       new HttpContext(new HttpRequest(String.Empty, returnUri.AbsoluteUri, String.Empty), new HttpResponse(TextWriter.Null)) 
       ); 
      RouteData routeData = RouteTable.Routes.GetRouteData(httpContext); 
Problemi correlati