2016-08-19 77 views
1

因此,我有一個網站,基本上每個租戶「面積」。所以它將顯示爲www.site.com/,並將使用一個區域進入該組頁面。租戶區域路線與默認路線

事情是我也有一個默認的路線以外的區域,所以你可以去www.site.com/這將帶你到實際的〜/ Views/Home/Index頁面。然而,如果您嘗試輸入www.site.com/Home/Index或者說該頁面創建一個新的羣組www.site.com/Group/Create,它認爲它需要到達不存在的區域並給出404資源無法找到。

這裏是在RouteConfig.cs

 routes.MapRoute(
      "Default", 
      "{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      new[] { "TicketSystem.Controllers" } 
     ); 

這裏默認路由是爲區域的路由配置:

 context.MapRoute(
      "Group_default", 
      "{group}/{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      new[] { "TicketSystem.Areas.Group.Controllers" }); 

所以{}組無論是集團當前正和然後它轉到該組的常規控制器/操作。然而,對於默認路線,它似乎仍然是區域路線,而不管它是什麼。

我在想可能會有後備。因此,當它試圖去該地區,並找不到正確的控制器/操作時,它會檢查下一個默認路由。如果它仍然找不到任何東西,它會給404錯誤資源找不到。雖然我不確定如何做到這一點。

所以要使www.site.com/正常工作並允許www.site.com/Home/Index工作。

+0

什麼是'group'價值?它可能只有一個來自您在應用程序中的區域或任何隨機字符串? – Shyju

+0

@Shyju該區域的組值可以是任何字符串,只要它沒有空格。加載它檢查的區域時,確保該組存在於數據庫中。所以它可以是www.site.com/testgroup或www.site.com/othergroup,這些都應該轉到實際組頁面。 – Insight

+0

所以你基本上只有一個區域。儀式?當該組在url中時,您希望由該區域進行處理? – Shyju

回答

1

問題是,當您嘗試訪問/Home/Index路由引擎不知道「主頁」,您的意思是控制器名稱或groupName!

爲了解決這個問題,您可以創建一個自定義路由約束,該約束檢查請求url中的組值是否是應用中的有效控制器名稱。如果是,請求將不會由區域路由註冊定義處理。

public class GroupNameConstraint : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, 
         RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     var asm = Assembly.GetExecutingAssembly(); 

     //Get all the controller names 

     var controllerTypes = (from t in asm.GetExportedTypes() 
      where typeof(IController).IsAssignableFrom(t) 
      select t.Name.Replace("Controller", "")); 
     var groupName = values["group"]; 
     if (groupName != null) 
     { 
      if (controllerTypes.Any(x => x.Equals(groupName.ToString(), 
                 StringComparison.OrdinalIgnoreCase))) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 
} 

當您註冊您的區域路線時註冊該約束。

public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      "Group_default", 
      "{group}/{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      new { anything = new GroupNameConstraint() } 


     ); 
    } 

這應該工作假設你將永遠不會有相同的控制器名稱的組名(例如:首頁)

+1

太棒了,完美的作品!我可以添加一個簡單的檢查,以確保人們不能使任何控制器名稱相同的組名稱,應該不難。第一次檢查約束條件,我學到的最好方法是實際使用它們,現在我在我自己的環境中使用它,現在它們都有意義。謝謝! – Insight

+0

對於那些正在執行分析的人,可以添加 'if(groupName.ToString()。Equals(「VSEnterpriseHelper.axd」,StringComparison.OrdinalIgnoreCase)){return false; }'這將允許分析axd文件正常工作,而不是它認爲它是一個組。 可能是一個更簡單的方法來做到這一點,但它可以讓你知道問題實際發生的地方。如果你想像一個asmx文件或其他東西。 – Insight