2009-09-09 12 views
5

Normalmente mis URL se parecen a la norma: www.example.com/controller/action¿Cómo configurar el enrutamiento para mi sección de administración en ASP.NET MVC?

Ahora quiero fijar mi sección de administración como:

 
www.example.com/admin/ 
www.example.com/admin/user/list 
www.example.com/admin/content/add 
etc. 

Así que el formato es: www.example.com/admin/controller/action

Me parece que no puede averiguar cómo configurar las rutas para que se vea como lo de arriba.

Respuesta

11

Solo necesita asignar una nueva ruta con la sección 'admin' codificada al principio de la definición de la ruta.

Por ejemplo agregar esto a su rutas en RegisterRoutes en el archivo Global.asax.cs y asegúrese de que aparece encima de la ruta por defecto (suponiendo que no haya añadido otras rutas):

routes.MapRoute(
    "Default",            
    "admin/{controller}/{action}/{id}",      
    new { controller = "Home", action = "Index", id = "" } 
); 

Nota: el 'admin' parte codificada al principio de la definición de la ruta.

Nota 2: Si ha agregado otras rutas más allá de la predeterminada tendrá que asegurarse de que sus rutas estén ordenadas correctamente.

Aquí hay un enlace a una buena entrada de blog de Scott Guthrie respecto MVC enrutamiento: URL Routing

+3

Usar cosas hace que los otros controladores sean demasiado accesibles mediante el prefijo 'admin /'. Uno puede visitar su sitio/home a través de yoursite/admin/Home también. –

6

respuesta de Kelsey es justo en la marca, pero quería añadir algo a la discusión. Otra opción es no tener rutas de "administrador" en absoluto, sino sesiones administrativas autenticadas para acceder realmente a las URL restringidas.

Así es a menudo como se hacen las cosas en las aplicaciones RESTful "tradicionales". Su controlador representa el tipo de recurso que está manipulando, la acción es el verbo y el ID es el identificador único para un miembro específico de ese recurso.

En otras palabras, en lugar de tener:

/content/list (for normal users) 
/admin/content/add (for admins) 

usted tendría

/content/list (for everyone) 
/content/add (for admin, but must be authenticated to work) 

Adición/admin/a la URL en realidad no se añada ningún benifits (excepto, quizás, que se puede escribir su lógica de seguridad con una sola regla en contra de cualquier cosa en/admin), pero la compensación es más complicada en las rutas y rompe el estándar RESTful. Romper las prácticas estándar no es malo en sí mismo, pero debe considerar que son estándares por una razón, y a menos que tenga beneficios específicos para romperlas, puede considerar adherirse a ellas.

Debe tenerse en cuenta que en ambos estilos de URL debe autenticar al usuario, de lo contrario, cualquiera podría usarlo.

En ASP.NET MVC, puede restringir el acceso a las acciones (o incluso a los controladores enteros) en función del nivel de usuario mediante ActionFilters. Al decorar sus acciones solo de administrador con estos filtros, puede asegurarse de que solo los usuarios administradores autentificados puedan usarlas.

Lee Scott Gu's entrada en el blog o Rob Connery's post para obtener más información.

+0

¿Cómo manejarías una acción de lista para los usuarios (no tienen acceso para ver todo) y una acción de lista para los administradores (donde sí pueden ver todo)? Preferiría no tener una lista de acciones listAdmin o algo tonto. O lo estoy haciendo de la manera incorrecta. –

+0

@MrRogers - Realmente depende de cómo los dos serán diferentes. Si la única diferencia es qué y cuántos datos se muestran, normalmente mantendrá la misma vista pero permitirá que el controlador especifique qué datos se mostrarán. Si las dos vistas son de hecho ligeramente diferentes (como tener botones de edición/eliminación para administradores), puede verificar el estado del administrador en la plantilla de vista con una declaración condicional. Puede establecer el estado del administrador en ViewData o en la sesión. Una última opción es sacarlos en parciales. Por lo tanto, solo tiene 1 vista, list.aspx, pero administrador vs usuario regular están cada uno en parciales. – Matt

3

A partir de la versión 2 de MVC, han agregado el concepto de 'área' que le permite hacer esto correctamente :) Aquí está ScottGu's post about MVC 2 Preview.

+0

Las áreas son una buena característica en MVC2, pero en este caso de uso particular todavía está dividiendo el mismo recurso en diferentes controladores. Entonces, ahora, en lugar de tener toda tu lógica de "contenido" en un solo controlador, la has eliminado. Es mucho más probable que viole la regla DRY en este caso. Sin mencionar la discordia semántica. – Matt

+0

Bueno, eso depende de lo que esté haciendo la interfaz de administrador. Si se trata de un backend para administrar el sistema, esto es algo completamente diferente de su contenido. Si es solo agregar funcionalidad, entonces sí, su sugerencia de simplemente limitarlo mediante autenticación es probablemente mejor. Pero dudo que eso sea todo lo que hay en la interfaz de administración. – Runeborg

Cuestiones relacionadas