在ASP.NET MVC中动态生成许多路由......这是一个非常糟糕的主意吗?

obl*_*joe 4 c# asp.net asp.net-mvc routing asp.net-mvc-routing

这是我的困境.我有一组实体,我想用它们来定义一组路线的起点.例如,我想为我的网站中的所有用户提供mydomain.com/username形式的自己的"子网站",然后挂起所有UserController操作.

这是我正在做的一个粗略的例子:

我有一个"UserController",有"Index","Profile"和"Bio"等动作方法.

public ActionResult Profile( int UserID )
{
    User u = User.SingleOrDefault(u => u.UserID == UserID);
    return View(u);
}
Run Code Online (Sandbox Code Playgroud)

在RegisterRoutes()方法中,我这样做:

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

这是有效的,它完全按照我的要求运行:

domain.com/[username]/Profile
domain.com/[username]/Bio
Run Code Online (Sandbox Code Playgroud)

现在是有效的工作路由,他们可以将UserID作为控制器中的方法参数,因为每个用户都有自己的路由.此外,默认路由仍然有效.好极了.

我的问题是,这是疯了吗?我正在路由表中为系统中的每个用户创建一个条目.有多少条路线太多了?如果有超过10个用户,这会杀死我的服务器吗?50?1000?

如果这疯了,我怎么可能实现这个目标?

提前致谢.我期待着蜂巢的一些意见.

wom*_*omp 10

在我看来,你的方法有很多问题.如果某人的用户名与您的其他控制器名称相匹配怎么办?你将永远无法调用该控制器.此外,路由系统(据我所知),按顺序测试所有路由,这意味着数千条路由将开始减慢路由查找速度,包括生成Urls(如Url.Content()Route.GetVirtualPath()).

你不能这样做吗?

/{username}/{action}
Run Code Online (Sandbox Code Playgroud)

并传入用户名作为参数的一部分?如果每条路线都使用相同的控制器和操作方法,那么为每个用户生成路由有什么意义呢?

如果您需要仅匹配用户控制器,请考虑实施自定义路由约束.该链接提供了一个创建控制器参数必须匹配的值列表的示例,但您可以轻松地为Action方法名称执行此操作.或者,您的自定义约束代码可以在数据库中查找用户名以查看它是否匹配.