我一直在开发纯粹的MVC CMS以获得乐趣,并且遇到了烦人的ASP.NET路由错误/功能。在ASP.NET路由中扩展RouteCollection
每个动态 CMS中的托管页面与从数据库中提取的特定路由相关联。这些在应用程序启动时加载。当用户添加新页面或编辑现有页面的Url时,我需要能够编辑RouteTable以相应地插入/编辑路由。
问题是,新路由不需要简单地添加到RouteCollection的末尾,而是可能需要插入到特定位置。似乎符合逻辑,只是RouteCollection仅包含从Collection<T>
继承的标准Insert(int idx, RouteBase route)
方法,该方法不包含路由名称。路由的名称非常重要,因为我始终使用它来生成操作链接。
看着反射器我看不到一个简单的方法来扩展这个集合,因为_namedMap字典被标记为私有。我尝试在插入点切入集合并重新添加每个项目,但是因为没有方法从RouteCollection中反向查找路由名称,所以我无法用它们之前可能已有的名称重新添加它们。太令人沮丧了!
为什么路线的名称不是路线对象的属性? 为什么如果MS认真对待我们扩展MVC和路由,他们会使关键类难以扩展?
对此处最佳解决方案有何建议?
编辑:
好吧,也许我本来应该很多很多清晰的在这里。我不是在寻找对我的CMS设计的批评。我很欣赏这些评论,但这不是我所要求的。
简化的问题。我如何在运行时将命名路线插入路线集合中?该类上的当前插入方法不足,因为它不包含名称。
干杯,
伊恩
为什么你正确地将路由映射到托管页面?您可能能够简化您的URL结构,以便您可以不断重复使用独立于托管页面的相同路由。 – 2010-11-17 16:56:49
@Berin:啊,是的。我没有想到这一点。每页一条路线确实是一个糟糕的设计。应该使用现有路线中的参数值来识别页面。 – 2010-11-17 17:00:54
我不是很清楚,例如我有一个托管的博客详细信息页面,其中包含post/{name}/{id}的url,我不必管理url解析。我有一个处理简单的静态URL的托管路由块的结尾,所以它不是每页一个路由,它的每个动态页面+ 1的路由。我的问题依然存在。 – madcapnmckay 2010-11-17 17:32:59