【问题标题】:Dynamically generating many routes in ASP.NET MVC... is this a totally bad idea?在 ASP.NET MVC 中动态生成许多路由......这是一个完全坏主意吗?
【发布时间】:2011-01-07 03:26:22
【问题描述】:

这是我的困境。我有一组实体,我想用它们来定义一组路线的起点。例如,我想为我站点中的所有用户提供他们自己的“子站点”,形式为 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?

如果这疯了,我还能如何实现这个目标?

提前致谢。我期待来自蜂巢思维的一些意见。

【问题讨论】:

    标签: c# asp.net asp.net-mvc routing asp.net-mvc-routing


    【解决方案1】:

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

    你就不能这样做

    /{username}/{action}
    

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

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

    【讨论】:

    • 那也会匹配默认路由,对吗?我想我没有把那部分说清楚。
    • 只要限制你的路线。我添加了一个链接到一篇应该有帮助的好帖子。
    • 感谢您的提示。我今天要研究路线限制,看看它们是否适合我。我会在这里报告我的发现。另外 - 我不担心您提出的用户名/控制器冲突(我的项目与我在问题中使用的示例不同)但我主要是在寻找一些关于路由系统如何处理大量条目的具体信息路由表。谢谢。
    • 非常感谢你。路线限制非常强大,我完全没有意识到它们。事实上,这将允许我在没有大量动态生成的 URL 的情况下解决这个问题。你摇滚。
    【解决方案2】:

    另一种方法是考虑在MapRoute() 中使用约束。保持 routes.MapRoute("", "{UserName}/{action}", new { controller="user", action="Index", UserID=user.UserID}); 的相同值,但添加 UserName 需要采用特定格式或列表的约束。

    我不知道它是否会更高效,但它是注册那么多(几乎相同)路由的替代方法。并且由于约束,它不会与默认路由冲突,无论如何您都应该将其作为最后一个 MapRoute() 调用,因此将首先评估这些。

    【讨论】:

      【解决方案3】:

      我不确定您的限制是什么,但路由系统的构建允许您使用一条路线而不是为每个用户使用一条路线。

      基于您自己的一个非常简单的示例是:

      routes.MapRoute(
               "",
               "{UserName}/{action}",
               new { controller="User", action="Index", UserID=user.UserID }
           );
      

      【讨论】:

      • 那会和默认路由冲突,是吗?我想我应该在我的问题中更清楚地说明这一点。我这样做是为了拥有子站点,但也保留默认的 {controller}/{action}/{id} 路由
      猜你喜欢
      • 1970-01-01
      • 2011-05-24
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 2011-10-10
      相关资源
      最近更新 更多