我正在测试 ASP MVC 路由。我在 ASP MVC 5.1 中遇到属性路由问题
当我有这样的控制器时:
public class FooController : Controller
{
[Route("foo")]
[HttpGet]
public ActionResult Get()
{
....
}
[Route("foo")]
[HttpPost]
public ActionResult Post()
{
....
}
}
然后为了测试哪个路由匹配特定请求,我调用routes.GetRouteData
. 我得到一个System.Web.Routing.RouteData
包含路由以及应该说明哪个控制器和操作匹配的值。
问题是这个路由现在是RouteCollectionRoute的一个实例,
这个内部类是对这两个动作的一组路由的包装器。控制器在 中RouteData.values
,但动作不在。您可以使用routeData.Values["MS_DirectRouteMatches"] as IList<RouteData>
.
在给出的示例中,列表中将有两个路由,用于两个操作方法。我需要知道哪些包含的路由实际上是匹配的,以便我可以读取匹配路由的操作方法名称是什么。我该如何解决这条路线?
我对拥有 a 的设计选择有点困惑RouteCollectionRoute
。路由时,你有一个路由集合,然后你通过调用来解析一个 url 的路由GetRouteData
。现在你有一条路线。但如果是RouteCollectionRoute
这样,它仍然是路由的集合,并且路由解析还没有结束。拥有 RouteCollectionRoute 获得了什么?路由解析现在是一个两步过程吗?还是递归过程?
我知道我正在浏览 ASP MVC 的内部结构,但这是唯一的方法,因为它在设计时并没有考虑到这种可测试性。即使是像公开一些内部类或方法这样简单的事情也会有很大帮助!