2008-10-24 28 views
22

Estoy tratando de crear una ruta con un nombre de usuario ...ASP.Net MVC Ruta de Usuario

Así la URL sería mydomain.com/abrudtkhul (abrudtkhul ser el nombre de usuario)

mi solicitud será tener perfiles públicos basados ​​en nombres de usuario (Ej: http://delicious.com/abrudtkuhl). Quiero replicar este esquema de URL.

¿Cómo puedo estructurar esto en ASP.Net MVC? Estoy usando Membresía/Proveedores de funciones también.

Respuesta

25

Esto es lo que quiere hacer, primero definir su mapa de rutas:

routes.MapRoute(
      "Users", 
       "{username}", 
       new { controller = "User", action="index", username=""}); 

Lo que esto le permite hacer es configurar la siguiente convención:

  • controlador: Usuario (del tipo UserController)
  • Acción: Índice (esto se asigna al método de Índice de UserController)
  • Nombre de usuario: este es el parámetro para el método de Índice de

Así que cuando se solicita la URL http://mydomain.com/javier esto se traduce a la convocatoria de UserController.Index (nombre de usuario cadena) donde nombre de usuario se establece en el valor de Javier .

Ahora ya está pensando en el uso de las clases MembershipProvider, que desea algo más parecido a esto:

public ActionResult Index(MembershipUser usr) 
{ 
    ViewData["Welcome"] = "Viewing " + usr.UserName; 

    return View(); 
} 

Con el fin de hacer esto, usted tendrá que utilizar un ModelBinder a hacer el trabajo de, bueno, vinculando desde un nombre de usuario a un tipo de Usuario de Membresía. Para hacerlo, deberá crear su propio tipo de ModelBinder y aplicarlo al parámetro de usuario del método Index. Su clase puede ser algo como esto:

public class UserBinder : IModelBinder 
{ 
    public ModelBinderResult BindModel(ModelBindingContext bindingContext) 
    { 
     var request = bindingContext.HttpContext.Request; 
     var username = request["username"]; 
     MembershipUser user = Membership.GetUser(username); 

     return new ModelBinderResult(user); 
    } 
} 

Esto le permite cambiar la declaración del método Índice ser:

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

Como se puede ver, hemos aplicado el [ModelBinder (typeof (UserBinder))] atributo al parámetro del método. Esto significa que antes de que se llame a su método, se llamará a la lógica de su UserBinder, de modo que cuando se llame al método, tendrá una instancia válida de su tipo MembershipUser.

+2

Esto ha cambiado en versiones más recientes de MVC ahora debería ser: objeto BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext) – Keith

+0

obtengo un nombre de usuario nulo en El modelo Binder ¿Por qué? –

+0

@Keith Todo funciona bien pero el enrutamiento url no funciona –

1

Usted podría tener una ruta que se parece a:

{username} 

con los valores por defecto de

Controller = "Users" 

para el producto acabado de:

routes.MapRoute(
        "Users", 
        "{username}", 
        new { controller = "Users" } 

Así que el nombre de usuario es el solo el parámetro url, el MVC supone que lo pasa al controlador del usuario.

+0

Bien, tuve eso ... pero no funciona por alguna razón. ¿Qué hago con la Vista? –

+0

Supongo que todos tendrían la misma vista. Su vista se puede llamar como quiera siempre que llame a la sobrecarga de Vista (cadena) y el aspx de la Vista se encuentre en el subdirectorio Usuarios en Vistas. –

+0

También debe especificar la acción. cambie la nueva parte a: nuevo {controller = "Users", action = "Show"} o lo que sea que quiera llamarlo –

1

¿Está tratando de pasarlo como parámetro a un controlador?

En teoría se podría hacer algo como esto:

routes.MapRoute ("nombre", "{usuario}/{controlador}/{} la acción", el nuevo controlador de {= "bla", action = "bla ", user =" "})

No tengo mucha experiencia con el enrutamiento de ASP.NET, pero creo que debería funcionar en.

1
routes.MapRoute(
      "Users", 
       "{username}", 
       new { controller = "Users", action="ShowUser", username=""}); 

Ok, lo que esto hará por defecto es el parámetro de nombre de usuario para el valor de {usuario}

por lo que incluso si usted ha escrito nombre de usuario = "" que va a saber para pasar el valor de { nombre de usuario} .. en virtud de las cadenas coinciden.

Esto podría esperar

para la forma url

http://website.com/username

  • Usuarios Contoller
  • ShowUser Acción (método en el controlador) parámetro
  • nombre de usuario en la acción ShowUser (método)
17

Es posible que desee considerar no permitir los nombres de usuario de ciertos tipos si desea tener otros controladores funcionales como Cuenta, Administrador, Perfil, Configuración, etc. También es posible que desee que su contenido estático no active la ruta de "nombre de usuario" . Con el fin de lograr ese tipo de funcionalidad (similar a cómo las direcciones URL de Twitter son procesados) se puede usar las siguientes rutas:

// do not route the following 
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
routes.IgnoreRoute("content/{*pathInfo}"); 
routes.IgnoreRoute("images/{*pathInfo}"); 

// route the following based on the controller constraints 
routes.MapRoute(
    "Default",            // Route name 
    "{controller}/{action}/{id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
    , new { controller = @"(admin|help|profile|settings)" } // Constraints 
); 

// this will catch the remaining allowed usernames 
routes.MapRoute(
    "Users", 
    "{username}", 
    new { controller = "Users", action = "View", username = "" } 
); 

A continuación, tendrá que tener un controlador para cada una de las señales de la serie restricción (por ejemplo,admin, help, profile, settings), así como un controlador llamado Users, y por supuesto el controlador predeterminado de Home en este ejemplo.

Si tiene muchos nombres de usuario que no desea permitir, puede considerar un enfoque más dinámico creando un controlador de ruta personalizado.

+0

Especificar contraints es la forma correcta de hacerlo. Nada más funcionó para mí. Seguirá yendo al enrutamiento predeterminado sin restricciones. Gracias por compartir su solución. –

+0

Sí, el mío también funciona cuando se agregan restricciones. ¿Por qué crees que eso está pasando? – avidProgrammer

+0

¿Cómo logro esto con asp.net core? –

Cuestiones relacionadas