2012-12-02 176 views
1

我在我的應用程序中定義了以下兩條路由。強制控制器的mvc路由

 routes.MapRoute(
      "ApplicationRoutes", 
      "{language}-{country}/{userid}/{controller}/{action}/{id}", 
      new { language="en" , country="gb", id = UrlParameter.Optional } 
     ); 


     routes.MapRoute(
      "Default", 
      "{language}-{country}/{controller}/{action}/{id}", 
      new { language = "en", country = "gb", id = UrlParameter.Optional } 
     ); 

第一條路線將被捕獲的URL像

  • EN-GB/11111 /目標/目錄
  • EN-GB/11111 /目標/編輯/ 2

第二條路線是默認路線,將用於這樣的事情

  • EN-GN /帳號/登錄

我是我,我想以武力只被調用,如果他們通過applicationRoutes途徑來某些控制器的問題。

例如我想確保目標控制器與routedata內的用戶標識一起調用。

我知道我可以檢查每個控制器的動作,如果用戶標識鍵存在與路由數據中的值。但是這對我來說並不高雅。

我也可以更具體介紹一下路線,做這樣的事情:

routes.MapRoute(
      "ApplicationRoutes", 
      "{language}-{country}/{userid}/Targets/{action}/{id}", 
      new { language="en" , country="gb", controller="targets", id = UrlParameter.Optional } 
     ); 

,但這不會直接停止請求EN-GB /目標/目錄/無需提供用戶ID值。

處理這個問題的最佳方法是什麼?

回答

0

您可以爲userid參數創建一個限制。

routes.MapRoute(
      "ApplicationRoutes", 
      "{language}-{country}/{userid}/{controller}/{action}/{id}", 
       new { language="en" , country="gb", id = UrlParameter.Optional }, 
       new { userid [email protected]"\d+" }); 

這將確保userid是一個有效的整數,否則下一個路由將用於處理請求。

+0

太好了。如果有一個控制器需要使用這個功能,那就完美了,但是可以說我擁有許多需要使用用戶控制器的控制器。我可以按照您的指示爲每個控制器實施特定的路線,但是是否有更優雅的解決方案來爲每個控制器創建路線? – Kramer00

+0

對不起,我忘記了那裏的控制器限制。您可以保持控制器變量不變。 –

+0

即使有限制,當然這不會阻止我進入/ en-gb/Targets/List,而不使用路由中的用戶標識符,因爲默認路由會處理這個問題。我想要確保在目標控制器上調用的每個操作都包含routedata中的用戶標識。 – Kramer00