2008-10-20 48 views
36

¿Cómo genero URLs amigables dentro de ASP.NET MVC Framework? Por ejemplo, tenemos una dirección URL que tiene este aspecto:¿Cómo puedo crear una URL amigable en ASP.NET MVC?

http://site/catalogue/BrowseByStyleLevel/1

El 1 es el identificador del nivel de estudios (Superior en este caso) para navegar, pero I'l gusta volver a formatear la URL de la misma forma en que StackOverflow lo hace.

Por ejemplo, estas dos direcciones URL le llevará al mismo lugar:

https://stackoverflow.com/questions/119323/nested-for-loops-in-different-languages

https://stackoverflow.com/questions/119323/

EDIT: La parte agradable de la URL se conoce como una babosa.

+0

¿Qué tipo de url qué quiere ver al final, éste /Catálogo/BrowseByStyleLevel/1/Superior? o/catalog/BrowseByStyleLevel/Higher? – liggett78

+0

Lo ideal es que sea el segundo, pero necesito que el identificador guarde la búsqueda en función del texto cada vez. – Kieron

+0

Consulte http://stackoverflow.com/a/20662188/1298685 para obtener una solución 'ASP.NET MVC 5'. –

Respuesta

47

Hay dos pasos para resolver este problema. En primer lugar, crear una nueva ruta o cambiar la ruta por defecto para aceptar un parámetro adicional:

routes.MapRoute( "Default", // Route name 
        "{controller}/{action}/{id}/{ignoreThisBit}", 
        new { controller = "Home", 
         action = "Index", 
         id = "", 
         ignoreThisBit = ""} // Parameter defaults) 

Ahora usted puede escribir lo que desea al final de su URI y la aplicación lo ignorará.

Al representar los enlaces, es necesario agregar el texto "amigable":

<%= Html.ActionLink("Link text", "ActionName", "ControllerName", 
        new { id = 1234, ignoreThisBit="friendly-text-here" }); 
+1

Hola, si intento esto, la URL generada desde Html.ActionLink sale así: /Catalog/BrowseBySubject/3?subject = química en lugar de /Catálogo/BrowseBySubject/3/química Cualquier idea - que he añadido la ruta por debajo de la ruta 'Default', y cambió el nombre a 'BrowseBySubject" – Kieron

+6

Eso significa que no está encontrando. la ruta correcta. Mueva la ruta anterior Predeterminado (que ocultará el valor predeterminado, si nada más los distingue, como una restricción). Use una restricción para hacer que esta nueva ruta se encuentre solo cuando sea necesario (por ejemplo, en Catalog/BrowseBySubject, o lo que sea regla es). –

+0

+1 para una respuesta sucinta agradable –

1

que tienen una ruta en el Global.asax

routes.MapRoute(
        "Default", // Route name 
        "{controller}/{action}/{id}", // URL with parameters 
        new { controller = "Home", action = "Index", id = ""} 
        // Parameter defaults) 

puede definir su propia ruta como:

controlador es la clase CS dentro de la carpeta de los controladores.

puede definir su identificación - con el nombre que elija.

el sistema pasará el valor a su método actionResult.

se puede leer más acerca de este paso aquí: http://www.asp.net/learn/mvc/tutorial-05-cs.aspx

1

Así es como he implementado la URL babosa en mi solicitud. Nota: El Maproute predeterminado no se debe cambiar y las rutas se procesan en el orden en que se agregan a la lista de rutas.

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", 
      action = "Index", 
      id = UrlParameter.Optional 
    } // Parameter defaults 
); 
routes.MapRoute("Place", "{controller}/{action}/{id}/{slug}", new { controller = "Place", action = "Details", id = UrlParameter.Optional,slug="" }); 
+0

Gracias por esa nota, el orden de coincidencia de rutas realmente importa, como en la mayoría de los marcos. – Dr1Ku

Cuestiones relacionadas