c# - 在 ASP.NET 路由中扩展 RouteCollection

标签 c# asp.net asp.net-mvc routes

我一直在开发一个纯 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/

相关文章:

c# - 如何将数据从静态 WebMethods 存储到 ViewState

c# - 我在哪里可以找到 "Microsoft.SqlServer.BatchParser.dll"?

asp.net-mvc - 如何防止 "Swapping"或 "Staged"Azure 网站注销用户?

c# - WinCE 6.0 通过ActiveSync/Window Mobile Device Center C#连接PC

c# - 如何在 UWP 的 Pivot 中获取 Pivot.ItemTemplate 中的控件?

c# - 使用 MediaElement 的 WPF 音频播放器有时会滞后

html - CSS类没有属性

asp.net - 为什么我的验证会在 MVC3 中发布之前对 get 请求触发?

asp.net-mvc - Rhino.Security : second-level cache is never hit for DetachedCriteria

asp.net-mvc - 在 Sitecore MVC 的 View 中获取媒体 url