我一直在开发一个纯 MVC CMS 的乐趣,并且遇到了一个令人讨厌的 ASP.NET 路由错误/功能。
我的 CMS 中的每个动态 托管页面都与从数据库中提取的特定路由相关联。这些在应用程序启动时加载。当用户添加新页面或编辑现有页面的 Url 时,我需要能够编辑 RouteTable 以相应地插入/编辑路由。
问题在于新路由不需要简单地添加到 RouteCollection 的末尾,而是可能需要插入到特定位置。除了 RouteCollection 只包含一个标准的 Insert(int idx, RouteBase route)
之外,看起来很合乎逻辑。方法继承自 Collection<T>
其中不包含路线名称。路线的名称很重要,因为我始终使用它来生成操作链接。
查看反射器,我看不到扩展此集合的简单方法,因为 _namedMap 字典被标记为私有(private)。我尝试在插入点切碎集合并再次重新添加每个项目,但是因为没有方法可以从 RouteCollection 中反向查找路由名称,所以我无法使用它们之前可能拥有的名称重新添加它们。太令人沮丧了!!!
为什么路由名称不是路由对象的属性? 为什么如果 MS 认真对待我们扩展 MVC 和路由,他们会使关键类难以扩展?
关于这里的最佳解决方案有什么建议吗?
编辑:
好吧,也许我应该在这里多得多更清楚。我不是在寻找对我的 CMS 设计的批评。我很欣赏这些评论,但这不是我要问的。
简化的问题。如何在运行时将命名路由插入路由集合?类的当前插入方法不够充分,因为它不包含名称。
干杯,
伊恩
最佳答案
如果您查看 ClearItems()
方法,这应该提供一种清空路由的方法。如果您首先将路线集合移动到临时集合中(并将新路线也插入其中),请运行 ClearItems() 然后使用 Add()
重新填充。 .
应该提到的是,您还应该使用 GetReadLock()
和 GetWriteLock()
以避免您的应用程序中出现潜在冲突。
关于c# - 在 ASP.NET 路由中扩展 RouteCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4204564/