gpt4 book ai didi

asp.net-mvc - 如何在 RouteCollectionRoute 中找到正确的路线?

转载 作者:行者123 更新时间:2023-12-02 15:49:30 25 4
gpt4 key购买 nike

I am testing ASP MVC routes 。我有an issue with attribute routes in ASP MVC 5.1

当我有这样的 Controller 时:

public class FooController : Controller
{
[Route("foo")]
[HttpGet]
public ActionResult Get()
{
....
}

[Route("foo")]
[HttpPost]
public ActionResult Post()
{
....
}
}

然后为了测试哪个路由与特定请求匹配,我调用 routes.GetRouteData 。我得到一个System.Web.Routing.RouteData其中包含路由以及应该说明哪个 Controller 和操作匹配的值。

问题是这条路由现在是 RouteCollectionRoute 的一个实例这个内部类是这两个操作的一组路由的包装器。 Controller 位于 RouteData.values ,但 Action 却不是。您可以通过 routeData.Values["MS_DirectRouteMatches"] as IList<RouteData> 获取这些包含的路线.

在给出的示例中,列表中将有两个路由,分别用于两个操作方法。我需要知道所包含的哪条路由实际上是匹配的,以便我可以读出匹配路由的操作方法名称是什么。我该如何解析这条路线?

我对 RouteCollectionRoute 的设计选择有点困惑根本不。路由时,你有一个路由集合,然后通过调用GetRouteData来解析url的路由。 。现在你有一条路了。但如果是RouteCollectionRoute所以它仍然是路线的集合,路线解析还没有结束。拥有 RouteCollectionRoute 可以获得什么?路线解析现在是一个两步过程吗?还是递归过程?

我知道我正在研究 ASP MVC 的内部结构,但这是唯一的方法,因为它在设计时确实没有考虑到这种可测试性。即使是简单的事情,例如 exposing some internal classes or methods会有很大帮助!

最佳答案

在 ASP.NET MVC 中,属性路由比传统的基于约定的路由要复杂一些。您可以从System.Web.Mvc.Controller.ExecuteCore()开始审核哪里GetActionName()对于属性路由返回 null,并让操作选择器选择要执行的操作。然后就可以跳转到System.Web.Mvc.ControllerActionInvoker.FindAction()它发挥了所有作用并找到 RouteCandidates 然后通过 ActionNameSelectors、ActionSelectors 等过滤它们。

我做了a pull request具有包装 ASP.NET MVC 逻辑的实现。

需要补充的一件重要事情:实现工作相当繁重,需要进行大量反射(reflection)。请看一下 ASP.NET 团队是如何测试路由的 e.g. in AttributeRoutingTest.cs 。您可以使用自己的 ControllerFactory,它将返回模拟 Controller ,其中的操作返回其名称、参数等。在我看来,这会更容易。

关于asp.net-mvc - 如何在 RouteCollectionRoute 中找到正确的路线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22416561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com