none
problema de enrutado en areas con app MVC RRS feed

  • Pregunta

  • Hola. estoy trabajando en un proyecto que tiene una capa de presentacion con varias Areas, y se me esta dificultando el testear la aplicacion, ya que los controladores y vistas que estoy desarrollando, se encuientran en un area definida.

    estuve buscando informacion acerca de trabajar con areas, y a pesar que en cuanto a la definicion del area esta todo claro, no logro establecer que al iniciar la aplicacion, el controlador y vista por defecto, sean los que yo le indico en la configuracion.

    en el archivo RouteConfig.cs tego esto:

    using System.Web.Mvc;
    using System.Web.Routing;
    
    namespace Exynko.Inv.Odin.Web
    {
        public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                //routes.MapRoute(
                //    name: "Default",
                //    url: "{controller}/{action}/{id}",
                //    defaults: new { controller = "NegocioCompra", action = "Index", id = UrlParameter.Optional }
                //);
    
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    //defaults: new { controller = "NegocioCompra", action = "Index", id = UrlParameter.Optional }
                    defaults: new { controller = "BusquedaInicial", action = "Index", id = UrlParameter.Optional }
                );
            }
        }
    }
    

    y en el area donde estoy trabajando, (bien Raiz) tengo lo siguiente

    using System.Web.Mvc;
    
    namespace Exynko.Inv.Odin.Web.Areas.BienRaiz
    {
        public class BienRaizAreaRegistration : AreaRegistration 
        {
            public override string AreaName 
            {
                get 
                {
                    return "BienRaiz";
                }
            }
            public override void RegisterArea(AreaRegistrationContext context) 
            {
                context.MapRoute(
                    "BienRaiz_default",
                    "BienRaiz/{controller}/{action}/{id}",
                    new { action = "Index", id = UrlParameter.Optional }
                );
            }
        }
    }

    aca hay una foto de como esta esquematizado el proyecto en el explorador de proyectos

    Alguien tiene una idea de que estoy haciendo mal?

    Saludos y gracias de antemano por las respuestas

    • Cambiado Joyce_AC jueves, 19 de enero de 2017 16:33
    jueves, 19 de enero de 2017 15:28

Todas las respuestas

  • hola

    Algo que noto raro es porque en BienRaizAreaRegistration en RegisterArea() porque en default no defines ningun controller ? indicas el action como index, pero de cual controller

    No intentaste definir en RegisterRoutes() el

     defaults: new { area= "BienRaiz" controller = "BusquedaInicial", action = "Index", id = UrlParameter.Optional }

    o sino podrias hacer que ingrese al Index de Home y de alli realizas un redirect al controller y action del area que necesites ver por defecto

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    jueves, 19 de enero de 2017 16:14
  • Hola Leandro, gracias por tu tiempo.

    te comento que he realizado varias pruebas aun sin exito.

    en registerRoutes deje esto

            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                var ns1 = new string[] { "Exynko.Inv.Odin.Web.Areas.BienRaiz.Controllers" };
                var ns2 = new string[] { "Exynko.Inv.Odin.Web.Areas" };
                var ns3 = new string[] { "Exynko.Inv.Odin.Web.Areas.BienRaiz" };
    
                routes.MapRoute(
                      "Default1",
                      "{controller}/{action}/{id}",
                      new { controller = "NegocioCompra", action = "Index", id = UrlParameter.Optional },
                      null, /*constraints*/
                      ns1
                   );
    
                routes.MapRoute(
                    "Default2",
                    "{area}/{controller}/{action}/{id}",
                    new {area = "BienRaiz", controller = "NegocioCompra", action = "Index", id = UrlParameter.Optional},
                    null, /*constraints*/
                    ns2
                    );
    
                routes.MapRoute(
                      "Default3",
                      "{area}/{controller}/{action}/{id}",
                      new { area = "BienRaiz", controller = "NegocioCompra", action = "Index", id = UrlParameter.Optional },
                      null, /*constraints*/
                      ns3
                   );
    
            }

    en ningún caso me ha funcionado bien, sin embargo, si en el navegador pongo la ruta 

    //http://localhost/Odin/bienraiz/NegocioCompra

    puedo llegar al recurso sin problemas.

    con el siguiente RegisterRoutes 

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

    me aparece este mensaje

    Error de servidor en la aplicación '/Odin'.

    No se encuentra la vista 'Index' ni su vista maestra o no hay un motor de búsqueda que admita las ubicaciones de búsqueda. Se buscó en las siguientes ubicaciones: 
    ~/Views/NegocioCompra/Index.aspx
    ~/Views/NegocioCompra/Index.ascx
    ~/Views/Shared/Index.aspx
    ~/Views/Shared/Index.ascx
    ~/Views/NegocioCompra/Index.cshtml
    ~/Views/NegocioCompra/Index.vbhtml
    ~/Views/Shared/Index.cshtml
    ~/Views/Shared/Index.vbhtml

    al parecer no esta buscando en las areas, a pesar que estan incluidas en la definicion.


    en cuanto al BienRaizAreaRegistration RegisterArea(), es el que se define por defecto al crear el area, creo que ese no lo han modificado.


    tambien hice esta otra prueba

                routes.MapRoute(
                      "Default",
                      "BienRaiz/{controller}/{action}/{id}",
                      new { controller = "NegocioCompra", action = "Index", id = UrlParameter.Optional }
                   ).DataTokens.Add("area" , "BienRaiz" );

    y el error que me aparece ahora es : 

    Error del servidor en aplicación "DEFAULT WEB SITE/ODIN"

    Internet Information Services 7.5

    <fieldset style="padding:0px 15px 10px;"><legend style="color:#333333;padding:4px 15px 4px 10px;margin:4px 0px 8px -12px;border-width:1px;border-style:solid;border-color:#ededed;background:rgb(231, 236, 240);font-weight:bold;font-size:1em;">Resumen de error</legend>

    Error HTTP 403.14 - Forbidden

    El servidor web está configurado para no mostrar una lista los contenidos de este directorio.

    </fieldset>

    sera que la ruta esta bien, pero en el IIS no se puede acceder al recurso de esa manera?

    viernes, 20 de enero de 2017 14:36
  • hola

    Definir varios default en el config principal no veo que solucione el problema

    Quizas lo mas simple seria que ingrese al index de un controller y desde alli realices un redirect al controler del area que quieres mostrar

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 20 de enero de 2017 15:28
  • Hola Tengo el mismo problema... pudiste solucionarlo o como lo solucionaste.

    Gracias.


    Conocuica

    martes, 14 de agosto de 2018 16:39