这是我的困境。我有一组实体,我想将它们定义为一组路线的起点。例如,我想为我站点中的所有用户提供他们自己的表单 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 作为 Controller 中的方法参数,因为每个用户都有自己的路线。此外,默认路由仍然有效。是的。
我的问题是,这疯了吗?我正在为系统中的每个用户在路由表中创建一个条目。多少条路线太多了?如果有超过 10 个用户,这会杀死我的服务器吗? 50? 1000?
如果这很疯狂,我还能如何实现这个目标?
提前致谢。我期待着蜂群思维的一些输入。
最佳答案
我对您的方法有很多担忧。如果有人的用户名与您的其他 Controller 名称之一匹配怎么办?您将永远无法调用该 Controller 。此外,路由系统(据我所知)按顺序测试所有路由,这意味着数千条路由将开始减慢路由查找,包括生成 Urls(如 Url.Content()
或 Route.GetVirtualPath()
).
你就不能这样吗
/{username}/{action}
并将用户名作为参数的一部分传递?如果每条路由都指向相同的 Controller 和操作方法,那么为每个用户生成路由有什么意义?
如果您只需要匹配用户 Controller ,consider implementing a custom route constraint .该链接提供了创建 Controller 参数必须匹配的值列表的示例,但您可以轻松地为您的 Action 方法名称执行此操作。或者,您的自定义约束代码可以在数据库中查找用户名以查看它是否匹配。
关于c# - 在 ASP.NET MVC 中动态生成许多路由...这是一个完全糟糕的主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2099289/