C# 在ASP.NET MVC中动态生成多个路由。。。这完全是个坏主意吗?
这是我的困境。我有一个实体集合,我想用它来定义一组路由的起点。例如,我想给我站点中的所有用户提供他们自己的“子站点”,格式为mydomain.com/username,然后挂起所有UserController操作 下面是我正在做的一个粗略的例子: 我有一个“UserController”,它有“Index”、“Profile”和“Bio”等操作方法 在registerOutes()方法中,我执行以下操作:C# 在ASP.NET MVC中动态生成多个路由。。。这完全是个坏主意吗?,c#,asp.net,asp.net-mvc,routing,asp.net-mvc-routing,C#,Asp.net,Asp.net Mvc,Routing,Asp.net Mvc Routing,这是我的困境。我有一个实体集合,我想用它来定义一组路由的起点。例如,我想给我站点中的所有用户提供他们自己的“子站点”,格式为mydomain.com/username,然后挂起所有UserController操作 下面是我正在做的一个粗略的例子: 我有一个“UserController”,它有“Index”、“Profile”和“Bio”等操作方法 在registerOutes()方法中,我执行以下操作: foreach (User user in User.Find(u => u.Act
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? 一千
如果这是疯狂的,我还能怎样实现这个目标呢
提前谢谢。我期待着从蜂巢思维中得到一些信息。我对你的方法有很多顾虑。如果某人的用户名与您的其他控制器名称之一匹配,该怎么办?你永远无法呼叫那个控制器。此外,路由系统(据我所知)按顺序测试所有路由,这意味着数千条路由将开始减慢路由查找,包括Url的生成(如
Url.Content()
或Route.GetVirtualPath()
)
你就不能这么做吗
/{username}/{action}
并将用户名作为参数的一部分传入?如果每个路由都指向相同的控制器和操作方法,那么为每个用户生成路由有什么意义
如果您需要仅匹配用户控制器。该链接提供了一个创建控制器参数必须匹配的值列表的示例,但是您可以轻松地为操作方法名称创建该列表。或者,您的自定义约束代码可以在数据库中查找用户名,以查看其是否匹配。我不确定您的限制是什么,但路由系统的构建允许您使用一条路由,而不是每个用户一条路由 一个基于您自己的非常简单的例子是:
routes.MapRoute(
"",
"{UserName}/{action}",
new { controller="User", action="Index", UserID=user.UserID }
);
另一种方法是在
MapRoute()
中使用约束。保持routes.MapRoute(“,“{UserName}/{action}”,new{controller=“user”,action=“Index”,UserID=user.UserID})的值相同代码>,但添加用户名必须采用特定格式或在列表中的限制
我不知道它是否会更有效,但它是注册那么多(几乎相同)路线的替代方案。由于约束,它不会与默认路由冲突,默认路由应该作为最后一个MapRoute()
调用,因此将首先计算这些路由。这也将匹配默认路由,对吗?我想我没有把那部分说清楚。只是限制你的路线。我添加了一个链接到一个很棒的帖子,应该会有所帮助。谢谢你的提示。今天我将研究路线限制,看看它们是否适合我。我会在这里报告我的发现。此外,我并不担心您提出的用户名/控制器冲突(我的项目与我在问题中使用的示例不同),但我主要是想了解路由系统如何处理路由表中大量条目的一些具体信息。谢谢你,沃姆。路线限制非常强大,我完全没有意识到。事实上,这将允许我解决这个问题,而无需动态生成URL的大列表。你太棒了。那会和默认路线冲突,是吗?我想我应该在我的问题中更清楚地说明这一点。我这样做是为了拥有子网站,但也保留了默认的{controller}/{action}/{id}路由
routes.MapRoute(
"",
"{UserName}/{action}",
new { controller="User", action="Index", UserID=user.UserID }
);