2015-09-21 104 views
1

我在routeConfig文件中有两条路由,如下所示。带静态前缀的MVC路由

  1. 路线与管理前缀它处理的管理部分请求
  2. 默认路由没有前缀,对此我添加了一个datatoken在备选区域
地图路线
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"); 

但问题是当我输入一个网址本地主机/ MyApp的/管理/首页/指数 它击中控制器abc.namespace1(预期)和本地主机/ MyApp的/首页/索引也创下主页里面控制器abc.namespace1代替HomeController里面的abc.namespace2候选区域

我想在这里做的是处理与管理前缀的所有路线里面控制器abc.namespace1和所有路由,而不与控制器的任何前缀内abc.namespace2这是我candiate区

关于

回答

0

我相信这可能与您指定名称空间的方式有关。命名空间必须用于控制器类所在的位置。

的模式是典型的<namespace of area>.<area name>.<controller namespace>

例如,在一个名为“管理”一区一期工程,命名空间必须是:

"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" } 
     ); 
    } 
} 

区域是基于约定的。如果你偏离预期的惯例太远,他们根本不起作用。