2015-09-21 103 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" } 
     ); 
    } 
} 

區域是基於約定的。如果你偏離預期的慣例太遠,他們根本不起作用。