使用MVC路由器确定路由是否存在

时间:2017-05-19 16:20:35

标签: asp.net-core-mvc

是否可以使用ASP.NET Core MVC路由器确定重定向到特定位置是否成功?

我想注入MVC​​路由器并且问它,如果我想要使用的路由完全存在,但我正在努力寻找正确的注入类并且没有看到MVCRouter中使用的任何方法

我也可以覆盖默认路由器并使用必要的方法扩展它。

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是将IActionSelector注入您的组件。

该组件负责控制器操作选择,并且可以告诉您是否存在具有给定参数的路由(即使存在模糊匹配)。

public class HomeController : Controller
{
    private readonly IActionSelector _actionSelector;

    public HomeController(IActionSelector actionSelector)
    {
        _actionSelector = actionSelector;
    }

    public IActionResult Index()
    {
        var routeData = new RouteData();
        routeData.Values["action"] = "DoesNotExist";
        routeData.Values["controller"] = "Home";
        var routeContext = new RouteContext(HttpContext)
        {
            RouteData = routeData
        };
        IReadOnlyList<ActionDescriptor> candidates = _actionSelector.SelectCandidates(routeContext);
        if (candidates == null || candidates.Count == 0)
        {
            //No actions matched
        }
        else
        {
            try
            {
                var actionDescriptor = _actionSelector.SelectBestCandidate(routeContext, candidates);
                if(actionDescriptor == null)
                {
                    //No action matched
                }
                //Action matched
            }
            catch (AmbiguousActionException)
            {
                //More than 1 action matched
            }
        }
        return View();
    }
}

它基本上是MvcRouteHandler所做的。首先找到所有可能的候选人,然后过滤到最佳候选人。如果它找到多个,您可能会或可能不想处理它,它可以抛出异常。

我想如果你可以通过扩展组件来改变行为来以某种方式更容易地做到这一点,但是MvcRouteHandler并不那么容易扩展。它目前只是在没有操作匹配时记录消息,这不会影响返回值。我们无法真正改变那里的签名。