2008-12-18 61 views
13

Debo ser denso. Después de hacer varias preguntas sobre StackOverflow, todavía estoy perdido cuando se trata de captar el nuevo motor de enrutamiento proporcionado con ASP.NET MVC. Creo que reduje el problema a uno muy simple, que, de ser resuelto, probablemente me permita resolver el resto de mis problemas de enrutamiento. Así que aquí está:ASP.NET MVC Enrutamiento Pregunta

¿Cómo registrarías una ruta para admitir una URL tipo Twitter para los perfiles de usuario?

www.twitter.com/username

asumir la necesidad de apoyar también:

  • la {controller}/{action}/{id} ruta por defecto.

  • URLs como:

    www.twitter.com/login
    www.twitter.com/register

es esto posible?

+0

Esta es una utilidad muy útil: http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx –

+0

Hola Kevin, has sacado su respuesta ?? – Parminder

+0

Compruebe esta pregunta: [¿Cómo funciona el enrutamiento web?] (Http://stackoverflow.com/questions/43243/how-does-web-routing-work#43363) – jfs

Respuesta

10

¿Qué hay de

routes.MapRoute(
    "Profiles", 
    "{userName}", 
    new { controller = "Profiles", action = "ShowUser" } 
); 

y luego, en ProfilesController, habría una función

public ActionResult ShowUser(string userName) 
{ 
... 

En la función, si no se encuentra ningún usuario con el nombre de usuario especificado, debe redireccionar a la ruta predeterminada {controller}/{action}/{id} (aquí, sería simplemente {controller}).

Las URL como www.twitter.com/login deberían estar registradas antes de esa.

routes.MapRoute(
    "Login", 
    "Login", 
    new { controller = "Security", action = "Login" } 
); 
0

Puede manejar eso en el controlador doméstico, pero el método del controlador no sería muy elegante. Supongo que algo como este fuerza de trabajo (no probado):

routes.MapRoute(
    "Root", 
    "{controller}/{view}", 
    new { controller = "Home", action = "Index", view = "" } 
); 

Luego, en su HomeController:

public ActionResult Index(string view) { 
    switch (view) { 
     case "": 
      return View(); 

     case "register": 
      return View("Register"); 

     default: 
      // load user profile view 
    } 
} 
+2

Incluso si esto funciona, no le estoy sugiriendo hazlo. Huele :) –

4

Lo importante es entender que las rutas coinciden en el orden en que están registradas. Por lo tanto, deberá registrar primero la ruta más específica, y la última más general, o todas las solicitudes que coincidan con la ruta general, nunca llegarán a la ruta más específica.

Para su problema yo registraría las reglas de enrutamiento para cada una de las páginas especiales, como "registrarse" y "iniciar sesión" antes de la regla de nombre de usuario.

0

OK No he intentado nunca esto correctamente, pero ha intentado ampliar la clase de RouteBase para tratar con los usuarios. Los documentos para RouteBase sugieren que el método GetRouteData debería devolver nulo si no coincide con la solicitud actual. Puede usar esto para verificar que la solicitud coincida con uno de los nombres de usuario que tiene.

Es posible añadir una subclase RouteBase usando:

routes.Add(new UserRouteBase()); 

Cuando se registra las rutas.

Puede valer la pena investigar.

0

Creo que su pregunta es similar a la mía. ASP.NET MVC Routing

esto es lo que robert harvey respondió.

routes.MapRoute(_ 
    "SearchRoute", _ 
    "{id}", _ 
    New With {.controller = "User", .action = "Profile", .id = ""} _ 

)

0

Aquí es una forma alternativa para standar registro de rutas:

1. Descargar RiaLibrary.Web.dll y hacer referencia a él en su proyecto de sitio web ASP.NET MVC

2. Decorate los métodos de controlador con la [Url] Atributos:

public SiteController : Controller 
{ 
    [Url("")] 
    public ActionResult Home() 
    { 
     return View(); 
    } 

    [Url("about")] 
    public ActionResult AboutUs() 
    { 
     return View(); 
    } 

    [Url("store/{?category}")] 
    public ActionResult Products(string category = null) 
    { 
     return View(); 
    } 
} 

BTW, '?' iniciar sesión en el parámetro '{? category}' significa que es opcional. Usted no tendrá que especificar explícitamente en los valores predeterminados de ruta, que es igual a este: Archivo

routes.MapRoute("Store", "store/{category}", 
new { controller = "Store", action = "Home", category = UrlParameter.Optional }); 

3. Actualización Global.asax.cs

public class MvcApplication : System.Web.HttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoutes(); // This do the trick 
    } 

    protected void Application_Start() 
    { 
     RegisterRoutes(RouteTable.Routes); 
    } 
} 

Cómo establecer valores predeterminados y restricciones? Ejemplo:

public SiteController : Controller 
{ 
    [Url("admin/articles/edit/{id}", Constraints = @"id=\d+")] 
    public ActionResult ArticlesEdit(int id) 
    { 
     return View(); 
    } 

    [Url("articles/{category}/{date}_{title}", Constraints = 
     "date=(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])")] 
    public ActionResult Article(string category, DateTime date, string title) 
    { 
     return View(); 
    } 
} 

Cómo establecer pedido? Ejemplo:

[Url("forums/{?category}", Order = 2)] 
public ActionResult Threads(string category) 
{ 
    return View(); 
} 

[Url("forums/new", Order = 1)] 
public ActionResult NewThread() 
{ 
    return View(); 
} 
Cuestiones relacionadas