【问题标题】:Getting ActionContext of an action from another从另一个获取一个动作的 ActionContext
【发布时间】:2020-04-18 12:34:39
【问题描述】:

我可以获取一个 ActionContext 或 ActionDescriptor 或可以根据路由名称描述特定操作的东西吗?

具有以下控制器。

public class Ctrl : ControllerBase
{
    [HttpGet]
    public ActionResult Get() { ... }

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

我想做的是在调用“Get”时,能够访问“Ge​​tUser”元数据,如动词、路由参数等

有点像

ActionContext/Description/Metadata info = somerService.Get(routeName : "GetUser")

ActionContext/Description/Metadata info = somerService["GetUser"];

这个想法中的一些东西。

【问题讨论】:

    标签: asp.net-core .net-core asp.net-core-3.0 actioncontext


    【解决方案1】:

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

    它在内部使用ActionDescriptorCollectionProvider 来获取该信息:

               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;
            }
    

    【讨论】:

    • 我正在寻找一个 IActionDescriptorCollectionProvider,谢谢
    【解决方案2】:

    试试这个:

    // Initialize via constructor dependency injection    
    private readonly IActionDescriptorCollectionProvider _provider; 
    
    var info = _provider.ActionDescriptors.Items.Where(x => x.AttributeRouteInfo.Name == "GetUser");
    

    【讨论】:

      猜你喜欢
      • 2018-04-18
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多