在 ASP.NET 路由中扩展 RouteCollection

mad*_*kay 5 c# asp.net asp.net-mvc routing

我一直在开发一个纯粹的 MVC CMS 来玩,并且遇到了 ASP.NET 路由的一个恼人的错误/功能。

我的 CMS 中的每个动态管理页面都与从数据库中提取的特定路由相关联。这些在应用程序启动时加载。当用户添加新页面或编辑现有页面的 Url 时,我需要能够编辑 RouteTable 以相应地插入/编辑路由。

问题是新路由不需要简单地添加到 RouteCollection 的末尾,而是可能需要插入到特定位置。看起来很合乎逻辑,只是 RouteCollection 只包含Insert(int idx, RouteBase route)继承自Collection<T>不包含路由名称的标准方法。路线的名称很重要,因为我始终使用它来生成操作链接。

看着反射器,我看不到扩展这个集合的简单方法,因为 _namedMap 字典被标记为私有。我尝试在插入点切掉集合并再次重新添加每个项目,但是因为没有方法可以从 RouteCollection 反向查找路由的名称,所以我无法使用它们之前可能拥有的名称重新添加它们。好郁闷!!!

为什么路由的名称不是路由对象的属性?为什么如果 MS 对我们扩展 MVC 和 Routing 是认真的,他们会让关键类难以扩展吗?

关于这里的最佳解决方案的任何建议?

编辑 :

好吧,也许我应该是非常非常清晰的在这里。我不是在寻求对我的 CMS 设计的批评。我很欣赏评论,但这不是我要问的。

简化的问题。如何在运行时将命名路由插入路由集合?类上的当前插入方法是不够的,因为它不包含名称。

干杯,

伊恩

Dan*_*son 0

如果您查看该ClearItems()方法,这应该提供一种清空路由的方法。如果您首先将路线集合移动到临时集合中(并在其中插入新路线),请运行 ClearItems() ,然后使用 Add().

应该提到的是,您还应该使用GetReadLock()andGetWriteLock()以避免应用程序中的潜在冲突。