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方法名称执行此操作.或者,您的自定义约束代码可以在数据库中查找用户名以查看它是否匹配.