2010-01-20 42 views
4

這是我的困境。我有一組實體,我想用它來定義一組路由的起點。例如,我想爲我的網站中的所有用戶提供他們自己的mydomain.com/username形式的「子網站」,然後將所有的UserController操作掛起。在ASP.NET MVC中動態生成許多路由...這是一個完全不好的主意嗎?

下面是我在做什麼粗略的例子:

我有一個「UserController的」,用行動方法,如「索引」,「檔案」和「生物」。

public ActionResult Profile(int UserID) 
{ 
    User u = User.SingleOrDefault(u => u.UserID == UserID); 
    return View(u); 
} 

在的RegisterRoutes()方法中,我這樣做:

foreach (User user in User.Find(u => u.Active == true)) 
{ 
    routes.MapRoute(
     "", 
     user.UserName + "/{action}", 
     new { controller="User", action="Index", UserID=user.UserID } 
    ); 
} 

這工作,和它的作品正是我希望它:

domain.com/[username]/Profile 
domain.com/[username]/Bio 

現在是有效的,工作路線,並且他們可以將UserID作爲控制器中的方法參數,因爲每個用戶都有自己的路由。此外,默認路由仍然有效。好極了。

我的問題是,這是瘋了嗎?我在系統中爲每個用戶在路由表中創建一個條目。有多少路線太多?如果有超過10個用戶,這會殺死我的服務器嗎? 50? 1000?

如果這瘋了,我該怎麼做到這個目標?

在此先感謝。我期待着蜂巢式的一些意見。

回答

10

在我的腦海裏,你的方法有很多擔憂。如果某人的用戶名與您的其他控制器名稱相匹配,該怎麼辦?你永遠無法調用該控制器。此外,路由系統(按照我的理解)依次測試所有路由,這意味着成千上萬的路由會開始減慢路由查找,包括生成Url(如Url.Content()Route.GetVirtualPath())。

你就不能這樣做

/{username}/{action} 

,並在用戶名作爲傳遞你的參數的一部分嗎?如果每條路線都採用相同的控制器和操作方法,那麼爲每個用戶生成路線有什麼意義?

如果您只需要匹配用戶控制器consider implementing a custom route constraint。該鏈接提供了創建控制器參數必須匹配的值列表的示例,但您可以輕鬆地爲您的Action方法名稱執行此操作。或者,您的自定義約束代碼可以在數據庫中查找用戶名以查看它是否匹配。

+0

這會匹配默認路由,是否正確?我想我沒有說清楚這一部分。 – obliojoe 2010-01-20 05:54:46

+0

只要約束你的路線。我添加了一個應該幫助的好帖子的鏈接。 – womp 2010-01-20 06:02:59

+0

感謝您的提示。我今天要研究路線限制,看看他們是否適合我。我會在這裏回覆我的發現。 另外 - 我不擔心你提出的用戶名/控制器衝突(我的項目不同於我在我的問題中使用的例子),但我主要是尋找一些關於路由系統如何處理大量條目的具體信息在路由表中。 Thnaks。 – obliojoe 2010-01-20 15:37:58

0

我不確定你的限制是什麼,但路由系統的構建允許你爲每個用戶使用一條路由而不是一條路由。根據自己會

一個很簡單的例子:

routes.MapRoute(
     "", 
     "{UserName}/{action}", 
     new { controller="User", action="Index", UserID=user.UserID } 
    ); 
+0

這會與默認路線衝突,是嗎?我想我的問題應該更清楚一點。我這樣做了子網站,但也保留了一個默認的{controller}/{action}/{id}路線 – obliojoe 2010-01-20 06:00:57

2

另一種方法是在看你的MapRoute()使用約束。保持routes.MapRoute("", "{UserName}/{action}", new { controller="user", action="Index", UserID=user.UserID});的相同值,但添加UserName需要以特定格式或列表形式的限制。

我不知道它是否會更高性能,但它是註冊許多(幾乎相同)路線的替代方案。並且由於約束條件,它不會與默認路由相沖突,因此無論如何您都應該將其作爲最後的MapRoute()調用,因此將首先對它們進行評估。

相關問題