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

回到顶部