ASP.NET MVC 5路由区域
我在ASP.NET MVC 5中有一个路由问题。我创建两个区域“公共”和“管理”,我在URL localhost/Example中设置Public/NewsController/Index默认站点。 WebUI中,但现在我不能使用localhost/Example.WebUI /联系...... 我与T4MVC代码:ASP.NET MVC 5路由区域
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 }
);
}
}
注册Routes.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
区域外,您的所有路由网址都完全相同。 MVC将始终使用第一个匹配路由并忽略后面的每条路由,因此,以正确的顺序配置路由以及确保路由不匹配任何网址(除了它应该包含的网址之外)非常重要。这个问题和可能的解决方案最好在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
类中的路线,则需要此路径)。
以上是 ASP.NET MVC 5路由区域 的全部内容, 来源链接: utcz.com/qa/262224.html