2011-03-09 10 views
7

Tengo una urlConfiguración de Index como la ruta por defecto para un controlador

que quiero convertir en

Eso también podría ser algo así como http://www.roadkillwiki.org/Page/my-url-with-spaces - el parámetro es una cadena. La configuración de ruta que he probado es:

routes.MapRoute(
    "ControllerDefault", 
    "{controller}/{id}", 
    new { controller = "Page", action = "Index", id = UrlParameter.Optional } 
); 

Sin embargo, esto está interfiriendo con el "id" ruta por defecto que los proyectos vienen con MVC. ¿Hay alguna forma de lograr esto?

+0

También http://stackoverflow.com/questions/973205/asp-net-mvc-default-route –

Respuesta

15

No necesita perder la ruta predeterminada. La clave para evitar que sus rutas interfieran entre sí es ordenarlas para que las reglas más específicas precedan a las menos específicas. Por ejemplo:

// Your specialized route 
routes.MapRoute(
    "Page", 
    "Page/{slug}", 
    new { controller = "Page", action = "Index" } 
); 

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

Luego, su PageController se vería así:

using System.Web.Mvc; 

public class PageController : Controller 
{ 
    public string Index(string slug) 
    { 
     // find page by slug 
    } 
} 

Dicho esto, me gustaría fuertemente consejo que hacer esto en su lugar:

// Your specialized route 
routes.MapRoute(
    "Page", 
    "Page/{id}/{slug}", 
    new { controller = "Page", action = "Index", slug = UrlParameter.Optional } 
); 

// MVC's default route (fallback) 
routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
); 

Y su PageController :

using System.Web.Mvc; 

public class PageController : Controller 
{ 
    public string Index(int id) 
    { 
     // find page by ID 
    } 
} 

Al incluir la ID de la página al comienzo de su URL (como StackOverflow) o al final, puede simplemente ignorar la babosa y, en su lugar, recuperar sus páginas por ID. Esto le ahorrará un montón de dolores de cabeza si sus usuarios cambian el nombre de la página. He pasado por esto y es doloroso; Básicamente, debe mantener un registro de todos los nombres que sus páginas han tenido en el pasado, solo para que sus visitantes/motores de búsqueda no obtengan un 404 cada vez que se renombra una página.

Espero que esto ayude.

+0

Mi problema es que la ID es una guía, que no es particularmente hermosa. Entonces: 'http: // www.roadkillwiki.org/Page/12312-4133-434a23-4424fd-444/documentation'. Parece que necesitaré otra columna con un ID decente –

+1

Hay algunas formas de hacer GUIDs más bonitas/más amigables con el SEO [por ejemplo, esto] (http://www.singular.co.nz/blog/archive/2007/12 /20/shortguid-a-shorter-and-url-friendly-guid-in-c-sharp.aspx) que reduce 'c9a646d3-9c61-4cb7-bfcd-ee2522c8f633' a' 00 amyWGct0y_ze4lIsj2Mw' pero acepto; un 'int' aquí es probablemente la forma menos intrusiva. –

+0

gracias por los enlaces de información + son muy útiles. Creo que me voy a quedar con los números ya que la url es mucho más ordenada –

1

Si usted no necesita una ruta por defecto que viene con plantilla de proyecto Puede configurar uno como este:

routes.MapRoute(
    "ControllerDefault", 
    "{controller}/{pagename}", 
    new { controller = "Page", action = "Index" } 
); 

Y que en su controlador que tendría una acción:

 public ActionResult Index(string pagename) 
     { 
      //do something 
     } 
Cuestiones relacionadas