2010-11-05 47 views
13

因爲我擴展了路由類,所以使用routes.add而不是routes.maproute(它具有名稱空間參數) 。 我需要在路由上添加名稱空間,因爲我的一個區域在站點中具有相同的控制器名稱 。 我的問題是我不知道從哪裏把命名空間..如何將名稱空間添加到自定義路由擴展

 

public class CultureRoute : Route 
    { 
    public CultureRoute(string url, object defaults, object constraints, RouteValueDictionary dataTokens) 
      : base(url, new RouteValueDictionary(constraints), dataTokens, new MvcRouteHandler()) 
     { 
     } 
} 
 

的Global.asax

 


      routes.Add("Default", new CultureRoute(
             "{controller}/{action}/{id}", 
             new {controller = "Home", action = "Index", id = UrlParameter.Optional})); 

 

回答

17
 


var dataTokens = new RouteValueDictionary(); 
      var ns = new string[] {"MyProject.Controllers"}; 
      dataTokens["Namespaces"] = ns; 


      routes.Add("Default", new CultureRoute(
             "{controller}/{action}/{id}", 
             new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
             null /*constraints*/, 
             dataTokens 
            )); 

 
1

對於那些誰正在追捕一個解決方案:

你首先需要一個接受DataTokens參數的構造函數,並將其傳遞給Route構造函數。

例如,我使用的是我在線提取的DomainRoute類,它沒有傳遞到Domain所需的附加參數。所以,我只是實施了類似的基本路線constructor構造:

public DomainRoute(string domain, string url, object defaults, object constraints, object dataTokens) 
       : base(url, new RouteValueDictionary(defaults), new RouteValueDictionary(constraints),new RouteValueDictionary(dataTokens),new MvcRouteHandler()) 
{ 
       Domain = domain; 
} 

接下來,如果你已經重寫你的GetRouteData方法,你必須返回在你的RouteData的DataTokens返回值。爲了解決這個問題,我必須查看Route.cs源代碼(THANK YOU JAVA2S)。

RouteData data = new RouteData(...); 
RouteValueDictionary dataTokens = DataTokens; 
if (this.DataTokens != null) { 
    RouteValueDictionary rdDataTokens = rd.DataTokens; 
    foreach (var token in dataTokens) 
     rdDataTokens.Add (token.Key, token.Value); 
    } 
} 
return data; 

現在簡單地按照Fleents的帖子在dataTokens [「Namespaces」]中放置你的名字空間。

問候, 達里爾

+0

相當一段時間以前......我認爲你正在使用Maarten B.的這個類,對嗎?那麼如上所示添加命名空間對我來說不起作用。它會將它們作爲RouteValueDictionary添加到RouteValueDictionary中。我目前正在擴展,有一個子域到區域路由。 – twomm 2013-10-04 14:50:46

+0

肯定很久以前......我甚至不知道原來的問題是什麼或我正在解決什麼。 =) – 2013-10-05 08:28:59

3

編輯:(以前創建的自定義路線,但,這不是必要的)。這應該做的伎倆。至少它確實在MVC 4中,最有可能是MVC 3

Route defRoute = new CultureRoute ("{controller}/{action}/{id}", 
      new RouteValueDictionary(new { controller = "Home", action = "Index", id = UrlParameter.Optional }), 
      new SomeRouteHandler()); 
if(defRoute.DataTokens == null) 
     defRoute.DataTokens = new RouteValueDictionary(); 
defRoute.DataTokens.Add("Namespaces", new string[] { "MVCApp.WebUI.Controllers" }); 
     routes.Add(defRoute); 
+0

DataTokens是隻讀的 – TruMan1 2013-02-20 16:11:43

+0

只有你的方式爲我工作。謝謝!!! – 2014-12-12 09:14:55

相關問題