我的routeConfig文件中有两条路由,如下所示。
- 使用 admin 前缀路由处理管理部分
的请求- 默认没有前缀的路线,为此我添加了一个数据表来映射候选区域
中的路线 醇>
routes.MapRoute(
name: "admin",
url: "Admin/{controller}/{action}/{id}",
defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional },
namespaces: new[] { "abc.namespace1" }
);
routes.MapRoute(
name: "default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional },
namespaces: new[] { "abc.namespace2" }
).DataTokens.Add("area", "Candidate");
但问题是当我输入网址 localhost / MyApp / Admin / Home / Index 它击中 abc.namespace1 (预期)中的控制器, localhost / MyApp / Home / Index 也击中 abc.namespace1 而不是候选区域中 abc.namespace2 内的HomeController。
我想要做的是处理带有管理员前缀的所有路由,其中 abc.namespace1 内有控制器,所有路径都没有任何带有 abc.namespace2 内部控制器的前缀,这是我的 Candiate Area 。
问候
答案 0 :(得分:0)
我认为这可能与您指定命名空间的方式有关。命名空间必须是控制器类所在的位置。
模式通常是<namespace of area>.<area name>.<controller namespace>
例如,在名为&#34; Admin&#34;的区域的项目中,名称空间必须为:
"MvcMusicStore.Areas.Admin.Controllers"
根据我的经验,关于如何设置区域的约定非常严格。您不应该在AreaRegistration
而不是项目的根目录中设置路线,以使其发挥作用。
public class CandidateAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Candidate";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Candidate_default",
"{controller}/{action}/{id}",
new { controller = "Account", action = "Login", id = UrlParameter.Optional },
new string[] { "<project name>.Areas.Candidate.Controllers" }
);
}
}
区域是基于惯例的。如果你偏离预期的约定太远,他们就不会发挥作用。