2012-07-17 14 views
10

quisiera eliminar el último segmento de Request.Url, por lo que por ejemplo ...Eliminar último segmento de Request.Url

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

cambiaría a

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

yo preferiría LINQ, pero aceptar cualquier solución que funcione eficientemente

+3

¿Desea utilizar linq? ¿por qué? – NicoSantangelo

+0

¿Qué desea que suceda si el URI contiene metacaracteres, cadenas de consulta o parámetros; p.ej. 'http: //www.example.com/admin/users.aspx/deleteUser? alpha = para% 27? beta =% 5F% 39'? –

+0

gran pregunta, idealmente las mantendría, solo eliminando el último segmento de la ruta. – bflemi3

Respuesta

14

Utilice la clase Uri para analizar el URI: puede acceder a todos los segmentos utilizando la propiedad Segments y reconstruir el URI sin el último 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 `/` 

Como una alternativa para conseguir el nombre del esquema y anfitrión, como se sugiere en Dour Arco Alto en su comentario:

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

+1 - debería mostrar un fragmento de código :) – EkoostikMartin

+4

Sugiero 'uri.GetComponents (UriComponents.SchemeAndServer, ...)' en lugar de 'uri.Scheme', ya que el primero maneja los puertos e incluye el': // '. –

+1

... o al menos 'uri.Authority' en lugar de' DnsSafeHost' – spender

1

Bueno, la solución trivial sería iterar carbón por carbón desde el final de la secuencia hacia su comienzo y busca el primer '/' por venir (supongo que también te vino a la mente).

Prueba esto:

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

mejor/limpiador es usar 'String.LastIndexOf' – Justin

+0

¿No podría haber un/en la cadena de consulta? –

9

Gran parte del mismo que @ respuesta de Oded, pero utilizando un UriBuilder lugar:

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

Para eliminar el último segmento de Request.Url basta con restar de absoluta uri la longitud del último segmento.

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

Por favor, haga la respuesta más detallada, y tenga en cuenta que su respuesta debe ser mejor (en algunos sentidos) que la existente. –

+0

Espero que ahora la única línea de mi código sea comprensible y usted, Victor Polevoy. – Mentor

+0

Tu respuesta es mucho mejor ahora. Evite las respuestas de solo código en el futuro. –

Cuestiones relacionadas