2010-01-18 23 views
5

我們正在使用由多個客戶端共享的asp.net mvc應用程序。我們需要這些網址來包含客戶網址友好名稱。例如:MVC自定義路線和動作鏈接

domain.com/clientName/controller/action/id

這下面似乎是工作,當涉及到的路由,而不是爲操作鏈接助手正確生成「CLIENTNAME」。

_routes.MapRoute("DefaultRoute", 
       "{clientName}/{controller}/{action}/{id}", 
       new { controller = "Home", action = "Index", id = string.Empty }, 
       new { clientName = @"[\w-]+" }); 

我們想繼續使用Html.ActionLink輔助方法,但不包括在生成的鏈接CLIENTNAME。我們是否必須在這種情況下編寫自己的助手,還是有其他方法?

是否有其他人用這種類型的路由場景構建了一個應用程序?任何建議,將不勝感激!

回答

0

什麼你正在嘗試做的,而不必使用RouteLink或指定一個匿名對象應該工作。確保您的路線註冊是正確的。舉例來說,如果你有這樣的:你DefaultRoute

routes.MapRoute("Base", 
       string.Empty, 
       new { controller = "Home", 
       action = "Index", 
       id = string.Empty }); 

,它可能會導致ActionLink的調用返回奇怪的結果。之前我被燒了。

7

你需要指定路由值:

<%= Html.ActionLink("some text", "action", new { clientName = "someclient" })%> 

會生成:

http://host/someclient/Home/action 

你也可以聲明路徑時指定一個默認值:

_routes.MapRoute("DefaultRoute", 
    "{clientName}/{controller}/{action}/{id}", 
    new { 
     controller = "Home", 
     action = "Index", 
     id = string.Empty, 
     clientName = "defaultClient" }, 
    new { clientName = @"[\w-]+" }); 
+0

這是一種魅力。正如你在另一條評論中所說的,你必須把所有路線都留到最後,否則你可能會得到意想不到的結果 – Ian1971 2014-02-04 11:42:24

11

這是我的體驗Darin引用的ActionLink方法將生成如下URL:

http://host/Home/action?clientName=someClient 

如果您想要完全按照您的指定生成URL。退房RouteLink方法,可以讓你指定路線的名字你匹配:

<%= Html.RouteLink("some text", "DefaultRoute", new { clientName = "someclient" })%> 
+3

@Bryan,我測試了我提供的代碼,並生成了預期的網址。也許在你的情況下,你把路由聲明放在錯誤的順序中,並且它是被執行的catch-all路由。具體的路線應該放在通行路線之前。 – 2010-01-18 21:28:05

+0

不錯的提示 - 謝謝達林。 – Bryan 2010-01-20 16:07:49

+0

好的答案,我在嘗試使用MVCContrib便攜式區域路由時遇到了同樣的問題。不是它像一個魅力。 – 2011-02-14 21:58:44