2009-07-02 28 views
7

Mi objetivo es tener el enrutamiento de URL como la siguiente:ASP.NET MVC SEO URL

http://www.abc.com/this-is-peter-page 

http://www.abc.com/this-is-john-page 

¿Cuál es la forma más sencilla de lograr esto sin poner el nombre del controlador de un nombre de función en la URL anterior? Si la página anterior no se encuentra, debería redireccionar a la página 404.

Complemento 1: this-is-peter-page y this-is-john-page no es contenido estático, sino que es de una base de datos.

+0

Es "esto-es-peter-página" una página estática o dinámica uno donde "este peter-página-is-" sería un campo de una base de datos ? – Pablo

+0

Es de la base de datos –

Respuesta

9

Al igual que en la implementación de KingNestor, también puede hacer lo siguiente, que facilitará su trabajo:

1) ¿Cuál fue tu modelo

public class MyUser{public String UserName{get; set;}} 

2) Agregar ruta a GLOBAL.ASAX

routes.MapRoute(
    "NameRouting", 
    "{name}", 
    new { controller = "PersonalPage", action = "Index", username="name" }); 

3) Haga rodar su propio archivador de modelo personalizado derivado de IModelBinder

public class CustomBinder : IModelBinder 
    { 
     public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      var request = controllerContext.HttpContext.Request; 
      var username = getUserNameFromDashedString(request["username"]); 
      MyUser user = new MyUser(username); 

      return user; 
     } 
    } 

4) en su acción:

public ActionResult Index([ModelBinder(typeof(CustomBinder))] MyUser usr) 
{ 
    ViewData["Welcome"] = "Viewing " + usr.Username; 
    return View(); 
} 
+0

sí, gracias por este complemento a la implementación de KingNestor –

+0

Gracias a Zhaph por reorganizar el paso 3 y el paso 4 –

+0

Encontré que bindingContext no contiene HttpContext –

4

personalmente no sugeriría una ruta así, pero si cumple con sus necesidades que tiene que hacer algo como:

Tenga la siguiente ruta en el archivo Global.asax:

routes.MapRoute(
     "NameRouting", 
     "{name}", 
     new { controller = "PersonalPage", action = "routeByName" }); 

Entonces , en su "PersonalPageController", tienen el siguiente método:

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult routeByName(string name) 
    { 
     switch (name) 
     { 
      case "this-is-peter-page": return View("PeterView"); 
      case "this-is-john-page": return View("JohnView"); 
      case Default: return View("NotFound"); 
     } 
    } 

Asegúrate de que tienes las vistas apropiadas: "PeterView", "JohnView" y "nOTFOUND" en su Views/PersonalPage/.

+0

Puede combinar eso con una restricción de ruta para evitar que las solicitudes 'no deseadas' lleguen a ese controlador. (Supongo que todavía necesita algún otro controlador) – chris166

+0

cómo evitar la solicitud 'no deseada'? –

+1

@Ervin Ter, puede proporcionar restricciones de ruta que limiten esta ruta a una expresión regular particular. – mmcdole

2

No creo que se pueda hacer esto. AFAIK ASP.NET MVC reconoce los parámetros de enrutamiento a través del carácter "/".

Su formato, por otro lado, va por "{controller} -is- {id} - {action}", por lo que no hay manera de que el controlador se pueda distinguir de la identificación y la acción.

Creo que el uso de los caracteres "/" no afecta ni degrada el SEO; solo afecta la legibilidad humana y la retención de la URL.

De todos modos, la siguiente URL es posible: http://www.abc.com/this-is-the-page-of/Peter añadiendo otra ruta en el método Global.asax RegisterRoutes:

 routes.MapRoute(
      "AnotherRoute", 
      "this-is-the-page-of/{id}", 
      new { controller = "PersonalPage", action = "Details", id = "" } 
     ); 

... suponiendo que implementa un método PersonalPageController detalles ActionResult que apunta a la página deseada.