bootstrap asp.net-mvc razor asp.net-mvc-areas

bootstrap - ASP.NET MVC `Html.ActionLink` entre" Áreas "



bootstrap 3 navbar (6)

He agregado un área nueva a mi proyecto MVC3 y estoy intentando vincular desde la página _Layout al área nueva. He agregado un área llamada ''Admin'' que tiene un controlador ''Meets''.

Usé el diseñador de estudio visual para agregar el área para que tenga la clase de registro de área correcta, etc., y el archivo global.asax registra todas las áreas.

Sin embargo, cuando uso los siguientes 2 enlaces de acción en una página en la raíz, me encuentro con algunos problemas:

@Html.ActionLink("Admin", "Index", "Meets", new { area = "Admin" }, null) @Html.ActionLink("Admin", "Index", "Meets", new { area = "" }, null)

Al hacer clic en ambos enlaces, me llevan al controlador Meets en el área de administración, donde la aplicación procede a arrojar un error que dice que no puede encontrar la página de índice (aunque la página de índice está presente en la carpeta Vistas en el área directorio.

El href para el primer enlace se ve así:

http://localhost/BCC/Meets?area=Admin

Y el href para el segundo enlace se ve así:

http://localhost/BCC/Meets

También si presiono el enlace que espero ser creado:

http://localhost/BCC/Admin/Meets

Acabo de recibir un error de recurso no se puede encontrar. Todo muy desconcertante! Espero que alguien pueda ayudar...


Extraño de hecho. Pasos que funcionaron perfectamente bien para mí:

  1. Cree una nueva aplicación ASP.NET MVC 3 utilizando la plantilla predeterminada de Visual Studio
  2. Agregue un área llamada Admin usando el diseñador de Visual Studio haciendo clic derecho en el proyecto
  3. Agregar nuevo controlador en ~/Areas/Admin/Controllers/MeetsController :

    public class MeetsController : Controller { public ActionResult Index() { return View(); } }

  4. Agregue una vista correspondiente ~/Areas/Admin/Views/Meets/Index.cshtml

  5. En el diseño ( ~/Views/Shared/_Layout.cshtml ) agrega enlaces:

    @Html.ActionLink("Admin", "Index", "Meets", new { area = "Admin" }, null) @Html.ActionLink("Admin", "Index", "Meets", new { area = "" }, null)

  6. Ejecuta la aplicación.

HTML procesado para los anclajes:

<a href="/Admin/Meets">Admin</a> <a href="/Meets">Admin</a>

Como se esperaba, el primer enlace funciona mientras que el segundo no.

Entonces, ¿cuál es la diferencia con su configuración?


Me di cuenta de esto: creé un nuevo proyecto de prueba e hice exactamente lo mismo que estaba haciendo antes y funcionó ... luego de una inspección adicional de todas las cosas relacionadas con la ruta entre los dos proyectos encontré una discrepancia.

En el archivo global.asax en mi aplicación BCC, había una línea de código deshonesto que inexplicablemente había aparecido:

public static void RegisterRoutes(RouteCollection routes) { // Problem here routes.Clear(); routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults ); } protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); }

Como puede ver dónde está mi comentario, en algún momento he colocado las rutas. Llamada Clear () al comienzo de RegisterRoutes, lo que significaba que después de haber registrado las Areas en Application_Start, estaba inmediatamente borrando lo que acababa de hacer. registrado.

Gracias por la ayuda ... ¡finalmente me condujo a mi salvación!


Otra opción es utilizar RouteLink () en lugar de ActionLink (), que elude por completo los registros de área:

Versión de ActionLink:

Html.ActionLink("Log Off", "LogOff", "Account", new { area = "" }, null)

Versión de RouteLink:

Html.RouteLink("Log Off", "Default", new { action = "LogOff", controller = "Account" })

El segundo parámetro es un "Nombre de ruta" que está registrado en Global.asax.cs y en varias subclases ''Registro de área''. Para usar ''RouteLink'' para vincular las diferentes áreas, solo necesita especificar el nombre de la ruta correcta.

El siguiente ejemplo muestra cómo generaría tres enlaces a diferentes áreas de un parcial compartido, que funciona correctamente independientemente de la zona en la que estoy ''en'' (si corresponde):

@Html.RouteLink("Blog", "Blog_default", new { action = "Index", controller = "Article" }) <br/> @Html.RouteLink("Downloads", "Download_default", new { action = "Index", controller = "Download" }) <br/> @Html.RouteLink("About", "Default", new { action = "Index", controller = "About" })

Feliz codificación!


Puede que este no sea el caso para la mayoría de los desarrolladores, pero encontré este problema cuando agregué mi primera área y no construí mi solución. Tan pronto como construí mi solución, los enlaces comenzaron a poblarse correctamente.


Resolví este problema haciendo lo siguiente.

En mi Global.asax.cs, tengo

public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" }); } protected void Application_Start() { //Initialise IoC IoC.Initialise(); AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); }

En PublicAreaRegistration.cs (Public Area), tengo

public class PublicAreaRegistration : AreaRegistration { public override string AreaName { get { return "Public"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute("Root", "", new { controller = "Home", action = "Index" }); context.MapRoute( "Public_default", "Public/{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional } , new[] { "<Project Namespace here>.Areas.Public.Controllers" } ); } }

En mi AuthAreaRegistration.cs (Área para acceso restringido), tengo

public class AuthAreaRegistration : AreaRegistration { public override string AreaName { get { return "Auth"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Auth_default", "Auth/{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }

Y finalmente, mis enlaces en mis páginas * .cshtml serían como

1) @ Html.ActionLink ("Cerrar sesión", "LogOff", nuevo {area = "Public", controller = "Home"})

o

2) @ Html.ActionLink ("Área de administración", "Índice", nuevo {area = "Auth", controller = "Home"})

Espero que esto le ahorre a alguien horas de investigación! Por cierto, estoy hablando de MVC3 aquí.

Kwex.


Verifique que su clase AdminAreaRegistration tenga AdminAreaRegistration aspecto:

public class AdminAreaRegistration : AreaRegistration { public override string AreaName { get { return "Admin"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Admin_default", "Admin/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } ); } }

y que tienes esto en Global.asax.cs :

protected void Application_Start() { ... // ViewEngine Registration AreaRegistration.RegisterAllAreas(); ... // Other route registration }