首页 > 解决方案 > .net core RouteData 模式匹配

问题描述

我正在尝试使用从 asp.net 核心中的 HttpContext.GetRouteData() 方法返回的 routedata 对象来匹配路由。

假设存在“ http://localhost/dogs/breed ”端点,那么检查当前 httpcontext 上的路由数据是否与该端点匹配的最佳方法是什么?

例如,最简单的方法是:

var matches = string.Equals((string) routeData.Values["controller"], "dog",
                       StringComparison.OrdinalIgnoreCase)
                   && string.Equals((string)routeData.Values["action"], "breed", 
                       StringComparison.OrdinalIgnoreCase);

这对我来说感觉很不雅,有没有更好的方法来检查这些数据以便在当前上下文中进行模式匹配?

谢谢

标签: .netasp.net-core.net-coreurl-routing

解决方案


这可以说是更优雅:

var actual = HttpContext.GetRouteData().Values;

var expected = new RouteValueDictionary {
    { "action", "Breed" },
    { "controller", "Dogs" },
};

return !expected.Except(actual).Any();

这将匹配到Dogs控制器的路由及其Breed操作。

我们还可以获得类型安全:

var actual = HttpContext.GetRouteData().Values;
var expected = new RouteValueDictionary 
{
    {
        "action", nameof(ValuesController.Get) 
    },
    {
        "controller", nameof(ValuesController)
            // remove the "Controller" suffix
            .Remove(nameof(ValuesController).Length - nameof(Controller).Length)
    },
};

return !expected.Except(actual).Any();

推荐阅读