none
Rotas de Areas por Sessao RRS feed

  • Pergunta

  • Gurisada,

    tenho uma area no meu MVC denominada Ecommerce, a qual eu dei duas rotas para essa area, da seguinte forma.

           Global

            protected void Application_Start()
            {

                var c = new AreaRegistrationContext("Ecommerce", RouteTable.Routes);

                c.MapRoute(
                     "ABC",
                     "ABC/{controller}/{action}/{id}",
                    new { controller = "Blog", action = "Iniciar", id = UrlParameter.Optional }
                );
                c.MapRoute(
                    "XYZ",
                    "XYZ/{controller}/{action}/{id}",
                    new { controller = "Blog", action = "Iniciar", id = UrlParameter.Optional });

                // AreaRegistration.RegisterAllAreas();
                RegisterGlobalFilters(GlobalFilters.Filters);
                RegisterRoutes(RouteTable.Routes);
            }

    funciona legal quando eu digito no browser  http://localhost:1764/abc ou http://localhost:1764/xyz,

    o problema é se eu acesso pela xyz ele nao segue acessando pela url que eu acessei, ele pega sempre a primeira "abc".

    Por exemplo no Inicial.cshtml, eu tenho o seguinte link

    @Html.ActionLink("Show Blog", "Parar", "Blog", new { area = "Ecommerce" }, null)

    a i acontece que se eu acessar pelo 'xyz', quando eu clico nesse link "Show Blog" ele vai acessar "http://localhost:1764/ABC/Blog/Parar" ao inves de "http://localhost:1764/xyz/Blog/Parar".

    Tipo eu preciso que ele siga acessando pela rota que eu acessei inicialmente.

    Alguem ja fez algo parecido?

    segunda-feira, 23 de julho de 2012 12:39

Respostas

  • Gurisada,

    consegui fazer o que eu precisava,

    alterei no Application_Start o registro da area para

                var c = new AreaRegistrationContext("Ecommerce", RouteTable.Routes);

                c.MapRoute(
                     "ecommerce_default",
                     "{area}/{controller}/{action}/{id}",
                    new { controller = "Blog", action = "Iniciar", id = UrlParameter.Optional }
                    , new { area = new Teste() }
                );

    coloquei o {area} no lugar no abc e xyz e coloquei uma classe de constraint para o parametro area, new { area = new Teste() }

    e na classe teste

     public class Teste : IRouteConstraint
        {
            public List<string> Areas { get; set; }

            public Teste()
            {
                this.Areas = new List<string>();

                this.Areas.Add("abc");
                this.Areas.Add("xyz");
            }

            public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
            {
                if (values.ContainsKey("area"))
                {
                    string area = (string)values["area"];

                    return this.Areas.Contains(area);
                }
                return false;
            }
        }

    funcionou blz.

    Vlw

    • Marcado como Resposta Jack.Prg segunda-feira, 23 de julho de 2012 14:13
    segunda-feira, 23 de julho de 2012 14:13