2010-04-21 18 views
13

Cuando se ejecuta el MVC 2 Areas example que tiene un blog de Área y Blog Controlador de la URL tiene el siguiente aspecto:ASP.NET MVC Areas: ¿Cómo ocultar el nombre de "Área" en la URL?

http://localhost:50526/Blog/Blog/ShowRecent en el formato: Áreas MVC

RootURL/AreaName/nombrecontrolador/ActionName

Habiendo descubierto, parece una excelente manera de organizar el código, es decir, crear un área para cada sección, que en mi caso cada sección tiene su propio controlador. Esto significa que cada AreaName = ControllerName. El efecto de esto es la ruta doble AreaName/ControllerName en la Url, por ejemplo /Blog/Blog/ anterior

Al no tener una comprensión clara del enrutamiento, ¿cómo podría configurar el enrutamiento para que no muestre AreaName?

EDIT:

Estoy tratando de reducir la cantidad de trabajo con rutas como éstas parecen efectuar entre sí (es decir, requieren orden específico) y pueden causar grandes dolores de cabeza :-) En la conversión de una aplicación formulario web existente a MVC, he convertido un par de secciones principales, estas tienen un Controlador cada una y una buena cantidad de Vistas/Acciones y aunque la mayoría del Acceso a Datos es código en ensambles, el número de clases de Modelo/ViewData está creciendo ... actualmente estoy creando subcarpetas en las carpetas de Modelos de Raíz/Vistas para estas secciones (o Áreas) y esperaba que la creación de Áreas funcionaría de la misma manera excepto tener el código organizado (con el uso de una ruta básica que cubre el Área) ¿Algún comentario sobre esto?

+1

Por curiosidad, si no quiere la carpeta adicional, ¿por qué implementar su aplicación de esa manera? – GalacticCowboy

+1

Btw .. No exagere con las rutas .. Si hace un área que tendrá un solo controlador, ¿está seguro de que necesita un área separada en primer lugar? :) –

+0

@GalacticCowboy, Artiom: buenos puntos y hemos agregado más comentarios arriba ... Puede parecer que las áreas pueden no ser el camino a seguir o, de hecho, algo para empezar a usar cuando tenemos que comenzar a organizar secciones más grandes/específicas. –

Respuesta

18

Dentro de la carpeta de cada área, verá un archivo *AreaName*AreaRegistration.cs. Aquí es donde se almacenan las reglas de organización del área. De forma predeterminada, a medida que se generan, contendrán el nombre del área por encima de todo lo demás. El problema es: si elimina el nombre de la zona "carpeta" de la ruta, la ruta capturará todo el "estándar" {controlador}/{ acciones}/{id} solicitudes. Que obviamente no es lo que quiere ...

Para solucionar esto, puede agregar los filtros de expresiones regulares en las rutas, de acuerdo con los nombres de controlador presentes en esa ruta. El inconveniente? No podrá tener dos controladores con el mismo nombre dentro de la aplicación (al menos no usar la ruta estándar). Siempre se puede pensar en una ruta diferente para acceder a ellos :))

Al final .. que tienen esta estructura:

/Áreas
/Areas/Blog/Controllers/BlogController.cs
/Areas/Blog/Controllers/FeedController.cs
/Areas/User/Controllers/UserController.cs
/Controllers/PageController.cs

Lo que debe tener es algo como esto: En BlogAreaRegistration.cs:

context.MapRoute(
    "Blog_default", 
    "{controller}/{action}/{id}", 
    new { action = "Index", id = UrlParameter.Optional }, 
    new { controller = "(Blog|Feed)" } 
); 

En UserAreaRegistration.cs:

context.MapRoute(
    "User_default", 
    "{controller}/{action}/{id}", 
    new { action = "Index", id = UrlParameter.Optional }, 
    new { controller = "(User)" } 
); 

En Global.asax.CS:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    context.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 
} 
protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    RegisterRoutes(RouteTable.Routes); 
} 

Nótese que en global.asax registros de área son lo primero! :)

UPD: Basado en su actualización pregunta: ¿No nos una cosa importante que usted tiene que tomar en cuenta si va a utilizar áreas: Si usted tiene un vínculo entre áreas, se le también debe proporcionar el nombre del área en el enlace. P.ej.

<%: Html.ActionLink("Link text", "Action", "Controller", new { area = "Blog", id = 4, title = "page-title" }); %> 

Ya sacó la idea.

En cuanto a los modelos de múltiples/puntos de vista, en el momento en que estoy siguiendo una estructura como esta

/Código/// ayudante, clases de extensión que no se mueven a bibliotecas
/Modelos/Datos/// las clases de EF + clases de validación están aquí
/modelos/ViewModels/{} controlador/// vista de los modelos almacenados por controlador

hasta ahora funciona muy bien, y me las arreglé para mantener la solución relativamente organizada . Como he dicho, la única área que he creado hasta ahora es el área Admin porque es que muy diferente del resto de la página web :)

+0

¡Gracias por eso! Tendré que jugar con esto (y pensar bien) para ver qué beneficio se obtiene al usar Áreas en la situación actual ... –

+1

Solo para darle mi situación actual: estoy trabajando en mi propio motor de blog (probablemente no sea público, escrito solo para mí). En este momento, la mayoría de los Controladores están en la carpeta predeterminada/Controladores. Páginas, registro/autenticación, comentarios, descargas de archivos, etc. Pero he creado un área de administración porque creo que debe separarse del código regular + tiene un aspecto diferente (carpeta Contect separada, etc.). Al final depende de usted) –

+0

Agregué una actualización a la respuesta, respondiendo a su actualización de la pregunta .. Umm ... eso sonó raro: D –

1

Sólo para responder a su pregunta original, en caso de que alguien está leyendo esto:

No nombre su blog de controlador [predeterminado]. Es por eso que obtienes blog/blog {area/controller}. Puede darle un nombre completamente diferente: es decir, blog/vista, blog/publicaciones, blog/reciente, etc. o, por defecto, como en casa. en este caso, si también tiene el país en sus controladores fuera de la zona, que querrá namespace su controlador por defecto:

routes.MapRoute("Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional}, 
    new[] { *appname*.Controllers" }); 

Esto asegurará que "/" y "/ blog" ir a la controlador "doméstico" apropiado. Si busca el error duplicado del controlador del hogar, encontrará más información al respecto.

Cuestiones relacionadas