2012-07-17 17 views
10

Vorrei rimuovere l'ultimo segmento di Request.Url, così per esempio ...Rimuovere ultimo segmento di Request.Url

http://www.example.com/admin/users.aspx/deleteUser 

cambierebbe per

http://www.example.com/admin/users.aspx 

preferirei LINQ, ma accettare qualsiasi soluzione che funzioni in modo efficiente.

+3

Si desidera utilizzare linq? perché? – NicoSantangelo

+0

Che cosa vuoi che accada se l'URI contiene metacaratteri, stringhe di query o parametri; per esempio. 'Http:? //www.example.com/admin/users.aspx/deleteUser alpha = per 27% di beta =% 5F% 39'?? –

+0

ottima domanda, idealmente li terrei, rimuovendo solo l'ultimo segmento del percorso. – bflemi3

risposta

14

Utilizzare la classe Uri per analizzare l'URI: è possibile accedere a tutti i segmenti utilizzando la proprietà Segments e ricostruire l'URI senza l'ultimo segmento.

var uri = new Uri(myString); 

var noLastSegment = string.Format("{0}://{1}", uri.Scheme, uri.Authority); 

for(int i = 0; i < uri.Segments.Length - 1; i++) 
{ 
    noLastSegment += uri.Segments[i]; 
} 

noLastSegment = noLastSegment.Trim("/".ToCharArray()); // remove trailing `/` 

In alternativa per ottenere il nome di schema e di accoglienza, come suggerito da Dour arco alto nel suo commento:

var noLastSegment = uri.GetComponents(UriComponents.SchemeAndServer, 
             UriFormat.SafeUnescaped); 
+0

+1 - dovrebbe mostrare però lo snippet di codice :) – EkoostikMartin

+4

Suggerisco 'uri.GetComponents (UriComponents.SchemeAndServer, ...)' piuttosto che 'uri.Scheme', poiché il primo gestisce le porte e include': // '. –

+1

... o almeno "uri.Authority' invece di' DnsSafeHost' – spender

1

Bene la soluzione banale sarebbe quella di iterare char dal char dalla fine del la stringa verso il suo inizio e cerca il primo '/' a venire (immagino che sia venuto in mente anche tu).

Prova questo:

string url = "http://www.example.com/admin/users.aspx/deleteUser"; 

for (int i = url.Length - 1; i >= 0; i--) { 

    if (url[i] == '/') return url.Substring(0, i - 1); 
} 
+1

better/cleaner utilizza 'String.LastIndexOf' – Justin

+0

Non è possibile che ci sia/nella stringa di query? –

9

Più o meno lo stesso di @ risposta di Oded, ma utilizzando un UriBuilder invece:

var uri = new Uri("http://www.example.com/admin/users.aspx/deleteUser"); 
var newSegments = uri.Segments.Take(uri.Segments.Length - 1).ToArray(); 
newSegments[newSegments.Length-1] = 
    newSegments[newSegments.Length-1].TrimEnd('/'); 
var ub=new UriBuilder(uri); 
ub.Path=string.Concat(newSegments); 
//ub.Query=string.Empty; //maybe? 
var newUri=ub.Uri; 
1

Per rimuovere l'ultimo segmento di Request.Url è sufficiente sottrarre assoluto uri la lunghezza dell'ultimo segmento.

string uriWithoutLastSegment = Request.Url.AbsoluteUri.Remove(
    Request.Url.AbsoluteUri.Length - Request.Url.Segments.Last().Length); 
+1

Si prega di rendere la risposta più dettagliata e di notare che la risposta deve essere migliore (con alcuni significati) rispetto a quella esistente. –

+0

Spero che ora sia comprensibile l'unica riga del mio codice e tu, Victor Polevoy. – Mentor

+0

La tua risposta è molto meglio ora. Evita le risposte al solo codice in futuro. –

Problemi correlati