首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从另一个操作获取操作的ActionContext

从另一个操作获取操作的ActionContext
EN

Stack Overflow用户
提问于 2020-04-18 20:34:40
回答 2查看 158关注 0票数 1

我能否获得一个ActionContext或ActionDescriptor或其他可以基于路由名称描述特定操作的东西?

具有以下控制器。

代码语言:javascript
复制
public class Ctrl : ControllerBase
{
    [HttpGet]
    public ActionResult Get() { ... }

    [HttpGet("{id}", Name = "GetUser")]
    public ActionResult Get(int id) { ... }
}

我想做的是,当"Get“被调用时,能够访问"GetUser”元数据,如动词、路由参数等

就像这样

代码语言:javascript
复制
ActionContext/Description/Metadata info = somerService.Get(routeName : "GetUser")

代码语言:javascript
复制
ActionContext/Description/Metadata info = somerService["GetUser"];

这个想法中的一些东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-18 21:58:49

有一个nuget包,AspNetCore.RouteAnalyzer,它可能会提供你想要的东西。它公开HTTP谓词、mvc区域、路径和调用的字符串。

在内部,它使用ActionDescriptorCollectionProvider来获取这些信息:

代码语言:javascript
复制
           List<RouteInformation> ret = new List<RouteInformation>();

            var routes = m_actionDescriptorCollectionProvider.ActionDescriptors.Items;
            foreach (ActionDescriptor _e in routes)
            {
                RouteInformation info = new RouteInformation();

                // Area
                if (_e.RouteValues.ContainsKey("area"))
                {
                    info.Area = _e.RouteValues["area"];
                }

                // Path and Invocation of Razor Pages
                if (_e is PageActionDescriptor)
                {
                    var e = _e as PageActionDescriptor;
                    info.Path = e.ViewEnginePath;
                    info.Invocation = e.RelativePath;
                }

                // Path of Route Attribute
                if (_e.AttributeRouteInfo != null)
                {
                    var e = _e;
                    info.Path = $"/{e.AttributeRouteInfo.Template}";
                }

                // Path and Invocation of Controller/Action
                if (_e is ControllerActionDescriptor)
                {
                    var e = _e as ControllerActionDescriptor;
                    if (info.Path == "")
                    {
                        info.Path = $"/{e.ControllerName}/{e.ActionName}";
                    }
                    info.Invocation = $"{e.ControllerName}Controller.{e.ActionName}";
                }

                // Extract HTTP Verb
                if (_e.ActionConstraints != null && _e.ActionConstraints.Select(t => t.GetType()).Contains(typeof(HttpMethodActionConstraint)))
                {
                    HttpMethodActionConstraint httpMethodAction = 
                        _e.ActionConstraints.FirstOrDefault(a => a.GetType() == typeof(HttpMethodActionConstraint)) as HttpMethodActionConstraint;

                    if(httpMethodAction != null)
                    {
                        info.HttpMethod = string.Join(",", httpMethodAction.HttpMethods);
                    }
                }

                // Special controller path
                if (info.Path == "/RouteAnalyzer_Main/ShowAllRoutes")
                {
                    info.Path = RouteAnalyzerRouteBuilderExtensions.RouteAnalyzerUrlPath;
                }

                // Additional information of invocation
                info.Invocation += $" ({_e.DisplayName})";

                // Generating List
                ret.Add(info);
            }

            // Result
            return ret;
        }
票数 1
EN

Stack Overflow用户

发布于 2020-04-18 22:09:24

试试这个:

代码语言:javascript
复制
// Initialize via constructor dependency injection    
private readonly IActionDescriptorCollectionProvider _provider; 

var info = _provider.ActionDescriptors.Items.Where(x => x.AttributeRouteInfo.Name == "GetUser");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61289162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档