ASP MVC子资源的路由

时间:2012-06-24 07:21:12

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

我注意到StackOverflow使用此URL:

http://stackoverflow.com/posts/123123/revisions

如何将此类路由添加到ASP MVC(3或4)? 如果我想添加修订版本的数字如下:

http://stackoverflow.com/posts/123123/revisions/2

转换为

  • 控制器=讯息
  • =帖子ID 123123
  • 子控制器=修订
  • 于RevisionId = 2

我的问题是我必须先设置entier路由。 如果我能够设置帖子的路由并在特定的帖子资源和称为修订的子资源之间添加路由,我将能够在任何返回后期资源的路由之后添加/修订。

谢谢你, IDO。

2 个答案:

答案 0 :(得分:3)

这样的路线在开始时很容易定义:

{controller}/{postId}/{action}/{revisionID}

但很可能匹配太多。这可以通过两种方式得到缓解:

  • 使用约束将postIdrevision限制为正整数(例如正则表达式\d+)。
  • 硬编码controlleraction的名称:

    posts/{postId}/revision/{revisionID}
    

    因此允许此路线尽早放在路线列表中,而只匹配路线 特定的URL格式。

答案 1 :(得分:2)

我不完全确定我理解你,但我认为这是你想要做的。这将使您能够处理正常的帖子 URL路由,并附加可选的修订路由。

routes.MapRoute(
    "RevisionsRoute",                               // Route name
    "posts/{PostID}/{SubController}/{RevisionID}",  // URL with parameters
    new { 
       controller = "posts", 
       action = "Index", 
       SubController = UrlParameter.Optional, 
       RevisionID = UrlParameter.Optional  
    }                                               // Parameter defaults
);

然后在此路由的控制器操作中,检查是否存在任何 SubController RevisionID 参数。

public ActionResult Index(string SubController = null, int RevisionID = -1)
{
    if (SubController != null)
    {
        if (SubController == "revisions")
        {
            // handle revisions route
        }
    }
    else
    {
        // handle normal posts route
    }
}

这样用户可以正常方式获得帖子:

/posts/1

或者按您想要的方式进行修订:

/posts/1/revisions/2