我在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);
}
}
你能帮我吗?
问题是,除了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 constraint或Custom route constraint进行更高级的匹配。
最后,您缺少将路线设置到特定区域所需的.DataTokens["area"] = "Admin"
(如果您未在AdminAreaRegistration
类的内部定义路线,则需要此。)>