【发布时间】:2011-05-11 09:54:44
【问题描述】:
我一直在开发纯粹的 MVC CMS,但遇到了一个烦人的 ASP.NET 路由错误/功能。
我的 CMS 中的每个 动态 托管页面都与从数据库中提取的特定路由相关联。这些在应用程序启动时加载。当用户添加新页面或编辑现有页面的 Url 时,我需要能够编辑 RouteTable 以相应地插入/编辑路由。
问题是新路由不需要简单地添加到 RouteCollection 的末尾,而是可能需要插入到特定位置。除了 RouteCollection 仅包含从 Collection<T> 继承的标准 Insert(int idx, RouteBase route) 方法之外,这似乎足够合乎逻辑,该方法不包含路由名称。路线的名称很重要,因为我始终使用它来生成操作链接。
查看反射器,我看不到扩展此集合的简单方法,因为 _namedMap 字典被标记为私有。我尝试在插入点切断集合并再次重新添加每个项目,但是因为没有方法可以从 RouteCollection 反向查找路线的名称,所以我无法使用它们之前可能拥有的名称重新添加它们。好郁闷!!!
为什么路由的名字不是路由对象的属性? 如果 MS 认真对待我们扩展 MVC 和路由,为什么它们会使关键类难以扩展?
关于这里的最佳解决方案有什么建议吗?
编辑:
好吧,也许我应该在这里更更清楚。我不是在寻找对我的 CMS 设计的批评。我很欣赏cmets,但这不是我要问的。
简化问题。如何在运行时将命名路由插入到路由集合中?类的当前插入方法不充分,因为它不包含名称。
干杯,
伊恩
【问题讨论】:
-
为什么您将路由一对一映射到托管页面?您或许可以简化您的 URL 结构,这样您就可以独立于托管页面重复使用相同的路由。
-
@Berin:啊,是的。我没有想到这一点。每页一条路线确实是一个糟糕的设计。应该使用现有路由中的参数值来识别页面。
-
我不太清楚,例如我有一个托管博客详细信息页面,其 url 为 post/{name}/{id},我不必管理 url 解析。我在处理简单静态 url 的托管路由块的末尾有一个全部内容,因此它不是每页一个路由,而是每个动态页面一个路由 + 1。我的问题仍然存在。
-
我确实说过“托管”页面,所以我明白你在说什么。也许如果您对您希望 URL 的外观有所了解,我可以帮助您想出一个更简单的路由策略。
-
嗯...缺少创建静态文件(并确保
RouteExistingFiles是true),没有一种很好的方法来做你所要求的,而不是每次都强制重新启动应用程序CRUD 发生在路由上。
标签: c# asp.net asp.net-mvc routing