具有任意深度的ASP.NET MVC动态路由和动作链接

我想用ASP.NET MVC组建一个论坛/留言板。 在这些类型的论坛上很常见的是分层板类别,例如:

-一般讨论;一般交流
-技术支援
– 网站技术支持
– 产品技术支持
—产品A技术支持
—产品B技术支持

然后,每个类别下面的主题和消息属于这些主题。 我主要关注的是1.)到达正确的位置,给定URL,2。)不包括​​我的URL中的大量不必要的信息,以及3.)能够从代码重新创建URL。

我想要一个像这样的URL:

 mysite.com/Forum/  - 论坛索引
 mysite.com/Forum/General-Discussion/  - “一般性讨论”的董事会索引 
 mysite.com/Forum/Technical-Support/Product/Product-A/  - “产品A技术支持”的主板索引
 mysite.com/Forum/Technical-Support/Website/Topic1004/  - “网站技术支持”主板中ID为1004的主题主题索引
 mysite.com/Forum/Technical-Support/Website/Topic1004/3  - 主题ID为1004的第3页

现在,我已经从中排除了动作名称,因为它们可以根据我的位置来推断。 我的数据库中的每个Board实体都有一个“UrlPart”列,该列已编制索引,因此我希望能够对该表执行相对快速的查询以确定我的位置。

问题是:为了找出正确的位置,我应该使用自定义路由处理程序,自定义路由绑定器,还是应该创建模糊的路由规则?

这个建议看起来相当不错,但它看起来似乎很多工作没有什么好处: ASP.NET MVC自定义路由搜索

这似乎表明创建模型绑定会更容易: MVC Dynamic Routes

为了实现#3,我将不得不创建自己的自定义URL生成逻辑,对吧?

如果您需要深度和/或不符合要求的URL,我建议您使用基于属性的路由,例如此处讨论的解决方案。

我更喜欢基于属性的方法而不是在Application_Start中放置每个路由,因为你有更好的引用局部性 ,这意味着路由规范和处理它的控制器是紧密相连的。

以下是您的控制器操作如何使用我实现的UrlRoute框架(在codeplex上可用)查找示例:

[UrlRoute(Path = "Forum")] public ActionResult Index() { ... } [UrlRoute(Path = "Forum/General-Discussion")] public ActionResult GeneralDiscussion() { ... } [UrlRoute(Path = "Forum/Technical-Support/Product/{productId}")] public ActionResult ProductDetails(string productId) { ... } [UrlRoute(Path = "Forum/Technical-Support/Website/{topicId}/{pageNum}")] [UrlRouteParameterDefault(Name = "pageNum", Value = "1")] public ActionResult SupportTopic(string topicId, int pageNum) { ... } 

使用此方法,您可以使用相同的帮助程序(Url.Route *,Url.Action *)生成出站URL,如果使用默认路由处理程序手动添加路由,则可以使用这些帮助程序,不需要额外的工作。

您可以让它们全部转到一个控制器操作,通过手动拆分其余的url来处理路由处理,并调用BLL上的方法,然后将任务委托给其他方法,最后返回View(),具体取决于您的需要。