0

我注意到 StackOverflow 使用这个网址:

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

如何将此类路由添加到 ASP MVC(3 或 4)?如果我想像这样添加修订号怎么办:

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

这转化为

  • 控制器=帖子
  • 邮政编号=123123
  • 子控制器=修订
  • 修订 ID=2

我的问题是我必须提前设置整个路由。如果我能够设置帖子路由并将特定帖子资源之间的路由添加到称为修订的子资源,我也可以在返回帖子资源的任何路由之后添加 /revision 。

谢谢你,伊多。

4

2 回答 2

3

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

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

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

  • 使用约束来限制postIdrevision整数(例如 regex \d+)。
  • 硬编码 和 的controller名称action

    posts/{postId}/revision/{revisionID}
    

    并因此允许将此路由放置在路由列表的早期,同时仅匹配非常特定的 URL 格式。

于 2012-06-24T07:34:08.507 回答
2

我不完全确定我是否理解你,但我认为这就是你想要做的。这将使您能够处理普通的Posts URL 路由,并附加一个可选的Revisions路由。

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
);

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

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
于 2012-06-24T07:34:59.333 回答