route mvc examples custom attribute c# asp.net-mvc asp.net-mvc-3 c#-4.0

c# - examples - La ruta MVC 3 Area no funciona



route controller c# (8)

Creé un área en mi aplicación MVC 3 llamada ''Blog''.

En global.asax tengo el siguiente código.

public static void RegisterRoutes(RouteCollection routes) { 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); }

Este es el código de mi Área

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

Cuando voy a la siguiente url http: // localhost / CMS / blog , aparece el siguiente error.

La vista ''Index'' o su principal no se encontró o no view engine admite las ubicaciones buscadas. Se realizaron búsquedas en las siguientes ubicaciones: ~ / Views / blog / Index.aspx ~ / Views / blog / Index.ascx ~ / Views / Shared / Index.aspx ~ / Views / Shared / Index.ascx ~ / Views / blog / Index. cshtml ~ / Views / blog / Index.vbhtml ~ / Views / Shared / Index.cshtml ~ / Views / Shared / Index.vbhtml

¿Cómo puedo solucionar esto?



Después de la respuesta de Mortens , ahora puedes descargar NuGet (o descargar e instalar manualmente) los paquetes de RouteMagic o Glimpse que proporcionan esta funcionalidad, y más.

Hay más información disponible en el blog de Phil Haacks sobre el estado de su herramienta y en qué se ha transformado. ¡Los comentarios también hacen una buena lectura!


El registro en su área parece ser incorrecto. Usted especifica un valor predeterminado para su acción, pero no para el controlador. Como normalmente tiene Home como el nombre del controlador, debe especificarlo.

También podría ser que no tenga la configuración correcta de sus carpetas, ya que debería haber configurado físicamente:

  • / Areas / Blog
  • / Áreas / Blog / Controladores
  • / Áreas / Blog / Vistas

... y una vez que hayas arreglado la ruta de tu blog, también necesitarás:

  • / Areas / Blog / Views / Home << Pon tu vista de índice aquí

El error que aparece parece indicar claramente que este es el problema.


Encontré lo que considero un error en el marco, con una solución alternativa. Si está intentando asignar una ruta predeterminada a una aplicación MVC 3 con áreas, su archivo global.asax podría tener algo como esto:

VB:

routes.MapRoute( "Default", "{area}/{controller}/{action}/{id}", New With {.area = "MyArea", .controller = "Home", .action = "Index", .id = UrlParameter.Optional} )

DO#:

routes.MapRoute( "Default", "{area}/{controller}/{action}/{id}", new { area = "MyArea", controller = "Home", action = "Index", id = UrlParameter.Optional } );

Si va a la raíz de la aplicación en la URL, puede obtener un error de tiempo de ejecución como este:

La vista ''Index'' o su principal no se encontró o no view engine admite las ubicaciones buscadas. Se realizaron búsquedas en los siguientes lugares:

Por alguna razón, el motor de vista no parece buscar en la carpeta de área para el archivo de vista lo mismo que si escribe en todo el enlace. Lo extraño es que el código llega a la acción del controlador. Aquí está la solución: Ponga este código en su acción de controlador:

VB:

If Not Me.ControllerContext.RouteData.DataTokens.ContainsKey("area") Then Me.ControllerContext.RouteData.DataTokens.Add("area", "MyArea") End If

DO#

if (!this.ControllerContext.RouteData.DataTokens.ContainsKey("area")) { this.ControllerContext.RouteData.DataTokens.Add("area", "MyArea") }


Estoy usando el enrutador de ruta de Phil Haack para solucionar problemas como este. Muestra convenientemente todas las rutas registradas y cómo la URL ingresada coincide con su configuración.

Funciona anulando el flujo de la aplicación normal, que habilita al agregar esta línea al final de Application_Start:

RouteDebug.RouteDebugger.RewriteRoutesForTesting( RouteTable.Routes );


Solo intente eliminar el contenido de los directorios siguientes como se menciona aquí y reconstruir el proyecto

C: / Temp C: / Users /% Nombre de usuario% / AppData / Local / Microsoft / VisualStudio C: / Windows / Microsoft.NET / Framework / v4.0.30319 / Archivos temporales ASP.NET C: / Windows / Microsoft.NET / Framework64 / v4.0.30319 / Archivos temporales de ASP.NET Ruta / To / Your / Project / obj / Debug


Tuve el mismo problema que Mindstorm Interactive, y tomé un enfoque ligeramente diferente. Sí, redirecciona al usuario, pero hizo que mi código pareciera menos alternativo, por así decirlo.

Creé un nuevo controlador, sin importar en qué área, ya que el problema está en el procesador que no encuentra la vista, no en el controlador.

Luego, el controlador redirige con el área (como en la solución de Mindstroms, la clave) incluida, y listo.

public class StartController : Controller { public ActionResult Index() { return RedirectToAction("Index", "MyController", new { area = "MyArea" }); } }

en RouteConfig solo agrega

routes.MapRoute(name: "Root", url: "", defaults: new { controller = "Start", action = "Index", area = "MyArea" });

Espero que ayude a alguien.


Verifique si tiene una ruta de acceso virtual asignada como nombre de área. Establecí la dirección del área en el estudio visual solo para depurar y me pidió que creara una ruta virtual. Así que AppRelativeCurrentExecutionFilePath siempre estaba ~ / y el enrutamiento no pudo determinar el área. Para IIS express, elimine la ruta virtual de su sitio:

C:/Users/username/Documents/IISExpress/config/applicationhost.config

Pasé 4 días para descubrirlo.