[英]Dynamically generating many routes in ASP.NET MVC… is this a totally bad idea?
這是我的困境。 我有一組實體,我想用它們來定義一組路線的起點。 例如,我想為我的網站中的所有用戶提供mydomain.com/username形式的自己的“子網站”,然后掛起所有UserController操作。
這是我正在做的一個粗略的例子:
我有一個“UserController”,有“Index”,“Profile”和“Bio”等動作方法。
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?
如果這是瘋了,我怎么可能實現這個目標?
提前致謝。 我期待着蜂巢的一些意見。
在我看來,你的方法有很多問題。 如果某人的用戶名與您的其他控制器名稱相匹配怎么辦? 你將永遠無法調用該控制器。 此外,路由系統(據我所知),按順序測試所有路由,這意味着數千條路由將開始減慢路由查找速度,包括生成Url.Content()
如Url.Content()
或Route.GetVirtualPath()
)。
你不能這樣做嗎?
/{username}/{action}
並傳入用戶名作為參數的一部分? 如果每條路線都使用相同的控制器和操作方法,那么為每個用戶生成路由有什么意義呢?
如果您需要僅匹配用戶控制器,請考慮實施自定義路由約束 。 該鏈接提供了一個創建控制器參數必須匹配的值列表的示例,但您可以輕松地為Action方法名稱執行此操作。 或者,您的自定義約束代碼可以在數據庫中查找用戶名以查看它是否匹配。
另一種方法是在MapRoute()
中使用約束。 保持相同的routes.MapRoute("", "{UserName}/{action}", new { controller="user", action="Index", UserID=user.UserID});
,但添加UserName需要以特定格式或列表中的約束。
我不知道它是否會更高效,但它是注冊那么多(幾乎相同)路線的替代方案。 並且由於約束,它不會與默認路由沖突,您應該將其作為最后一次MapRoute()
調用,因此將首先評估這些路由。
我不確定你的限制是什么,但路由系統的構建允許你用一條路線而不是每個用戶一條路線來做這件事。
基於您自己的一個非常簡單的示例是:
routes.MapRoute(
"",
"{UserName}/{action}",
new { controller="User", action="Index", UserID=user.UserID }
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.