ASP.NET MVC 5路由区域

问题描述 投票:0回答:1

我在ASP.NET MVC 5中路由存在问题。我创建了两个区域“ Public”和“ Admin”,并在url localhost / Example.WebUI中设置了Public / NewsController / Index默认站点,但是现在我不能使用本地主机/Example.WebUI/管理员...我的T4MVC代码:

AdminAreaRegistration.cs

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 { area = MVC.Admin, controller = MVC.Admin.Hierarchy.Name, action = MVC.Admin.Hierarchy.ActionNames.Index, id = UrlParameter.Optional }               
            );
        }
    }

PublicAreaRegistration.cs

 public class PublicAreaRegistration : AreaRegistration 
        {
            public override string AreaName 
            {
                get 
                {
                    return "Public";
                }
            }

            public override void RegisterArea(AreaRegistrationContext context) 
            {
                context.MapRoute(
                    "Public_default",
                    "{controller}/{action}/{id}",
                    new { controller = MVC.Public.News.Name, action = MVC.Public.News.ActionNames.Index, id = UrlParameter.Optional }
                );
            }
        }

RegistrationRoutes.cs

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { area = MVC.Public.Name, controller = MVC.Public.News.Name, action = MVC.Public.News.ActionNames.Index, id = UrlParameter.Optional },
                namespaces: new[] { "Example.WebIU.Areas.Public.Controllers" }
            );

            routes.MapRoute(
                name: "MyRoute",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = MVC.Admin.Hierarchy.Name, action = MVC.Admin.Hierarchy.ActionNames.Index, id = UrlParameter.Optional },
                namespaces: new[] { "Example.WebIU.Areas.Admin.Controllers" }
            );
        }

和Global.asax

public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AutoMapper.Mapper.Initialize(cfg => cfg.AddProfile<AutomapperProfile>());
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
    }

你能帮我吗?

c# asp.net-mvc asp.net-mvc-5 asp.net-mvc-routing asp.net-mvc-areas
1个回答
1
投票

问题是,除了Admin区域外,您所有的路由URL都完全相同。 MVC将始终使用第一个匹配的路由,并忽略其后的每条路由,因此,必须以正确的顺序配置路由,并确保该路由除应有的URL外不与其他任何URL匹配,这一点很重要。在Why map special routes first before common routes in asp.net mvc?中最好地描述了此问题及其解决方案。

最简单的解决方法是在URL中使用文字段,以确保它仅匹配一组特定的URL。

PublicAreaRegistration.cs

public class PublicAreaRegistration : AreaRegistration 
{
    public override string AreaName 
    {
        get 
        {
            return "Public";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "Public_default",
            "Public/{action}/{id}",
            new { controller = MVC.Public.News.Name, action = MVC.Public.News.ActionNames.Index, id = UrlParameter.Optional }
        );
    }
}

RegisterRoutes.cs

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapRoute(
        name: "MyRoute",
        url: "MyRoute/{action}/{id}",
        defaults: new { controller = MVC.Admin.Hierarchy.Name, action = MVC.Admin.Hierarchy.ActionNames.Index, id = UrlParameter.Optional },
        namespaces: new[] { "Example.WebIU.Areas.Admin.Controllers" }
    ).DataTokens["area"] = "Admin";

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { area = MVC.Public.Name, controller = MVC.Public.News.Name, action = MVC.Public.News.ActionNames.Index, id = UrlParameter.Optional },
        namespaces: new[] { "Example.WebIU.Areas.Public.Controllers" }
    );
}

注意,您也以错误的顺序注册了MyRoute。必须将此路由放置在Default之前,以使其完全无效。如前所述,您还需要一种方法来确保并非所有3个细分网址都匹配。上面显示了使用文字片段进行此操作的方法,但是您可以使用Regex route constraintCustom route constraint进行更高级的匹配。

最后,您缺少将路线设置到特定区域所需的.DataTokens["area"] = "Admin"(如果您未在AdminAreaRegistration类的内部定义路线,则需要此。)>

© www.soinside.com 2019 - 2024. All rights reserved.