【问题标题】:ASP.NET Core - get route from controller typeASP.NET Core - 从控制器类型获取路由
【发布时间】:2020-08-18 10:00:23
【问题描述】:

如何从控制器类型中获取路由?

例如从某种服务或其他东西获取MyTestControllerLoosedController 的路线。

XService.GetRoute<MyTestController>(); // output: /api/x/MyTest
XService.GetRoute<LoosedController>(); // output: /api/loosed-items

[Route("api/x/[controller]")]
public abstract class MyControllerBase : ControllerBase {
    [HttpGet("{id}")]
    public ActionResult Get(int id) {
        return Ok(id);
    }
}

[Route("api/loosed-items")]
public class LoosedController : MyControllerBase {
}

public class MyTestController : MyControllerBase {
    [HttpGet("action")]
    public ActionResult FindThis() {
        return Ok();
    }
}

【问题讨论】:

标签: c# asp.net-core routes


【解决方案1】:

根据您的描述,您可以尝试使用IActionDescriptorCollectionProvider 获取所有控制器路由。

更多细节,您可以参考以下代码:

界面:

public interface IGetRoute
{
    IList<RouteModel> GetRotue(string type);
}

类: 公共类GetRoute:IGetRoute { 私有只读 IActionDescriptorCollectionProvider _actionDescriptorCollectionProvider;

    public GetRoute(IActionDescriptorCollectionProvider actionDescriptorCollectionProvider)
    {
        _actionDescriptorCollectionProvider = actionDescriptorCollectionProvider;
    }


    public IList<RouteModel> GetRotue(string type)
    {

        var typename = type.Replace("Controller", "");

        List<RouteModel> result = new List<RouteModel>();

        foreach (ActionDescriptor _e in _actionDescriptorCollectionProvider.ActionDescriptors.Items)
        {

            if (_e.AttributeRouteInfo != null)
            {
                if (_e.AttributeRouteInfo.Template.Contains(typename))
                {
                    result.Add(new RouteModel() { Name = _e.AttributeRouteInfo.Template, ControllerName = typename });
                }
            } else if (_e is ControllerActionDescriptor)
            {
                var e = _e as ControllerActionDescriptor;
                if (e.ControllerName == typename)
                {
                    result.Add(new RouteModel() { Name = $"/{e.ControllerName}/{e.ActionName}", ControllerName = typename });
                }

            }


        }

        return result;
    }
}

在 ConfigureServices 方法中注册:

        services.AddScoped<IGetRoute, GetRoute>();

用法:

        var res = _route.GetRotue(typeof(MyTestController).Name);

        var res2 = _route.GetRotue(typeof(HomeController).Name);

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    相关资源
    最近更新 更多