繁体   English   中英

ASP.NET MVC 5 路由区域

[英]ASP.NET MVC 5 Routing Areas

我在 ASP.NET MVC 5 中遇到路由问题。我创建了两个区域“Public”和“Admin”,并在 url localhost/Example.WebUI 中设置了 Public/NewsController/Index 默认站点,但现在我不能使用 localhost/ Example.WebUI/Admin...我的 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 }               
            );
        }
    }

公共区域注册.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 }
                );
            }
        }

注册路由.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);
        }
    }

你能帮助我吗?

问题是除了Admin区域之外,您的所有路由 URL 都完全相同。 MVC 将始终使用第一个匹配的路由并忽略后面的每个路由,因此以正确的顺序配置路由很重要,并确保路由不匹配任何 URL,除了它应该匹配的 URL。 这个问题及其可能的解决方案在为什么在 asp.net mvc 中首先映射特殊路由之前先映射特殊路由? .

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

公共区域注册.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 }
        );
    }
}

注册路由.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 个分段 URL 都匹配。 上面显示了使用文字段来执行此操作,但您可以使用Regex 路由约束自定义路由约束进行更高级的匹配。

最后,您缺少将路由设置为特定区域所需的.DataTokens["area"] = "Admin" (如果您没有在AdminAreaRegistration类中定义路由,则需要此设置)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM