devfric
devfric

Reputation: 7532

How to get the current ASP.NET core controller method name inside the controller using Reflection or another accurate method

I want to get the current method name of my ASP.NET Core controller

I have tried getting the method name through reflection:

    [HttpGet]
    public async Task<IActionResult> CreateProcess(int catId)
    {
        string methodName = System.Reflection.MethodBase.GetCurrentMethod().Name;

but this gives me a value of MoveNext and not CreateProcess

Take note I don't want to use the ViewContext

string methodName = ActionContext.RouteData.Values["action"].ToString();

as I lowercase my urls via the startup settings.The above will get me createprocess instead of CreateProcess

I preferably want an easy one-liner and not a multiline extension method.

Upvotes: 23

Views: 26884

Answers (6)

muhdamean
muhdamean

Reputation: 91

modifying dfmetro above solutions works for me

((Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor)ViewContext.ActionDescriptor).ControllerName; 

use .ControllerName to get the controller name.

not enough reputation to comment that's why i make i post.

Upvotes: 0

Jim Aho
Jim Aho

Reputation: 11957

You can get it by base.ControllerContext.ActionDescriptor.ActionName

This works in .NET Core 1.0.

Upvotes: 0

Felix Av
Felix Av

Reputation: 1254

You can use the fact that it is not just any method but a controller and use ActionContext.ActionDescriptor.Name property to get the action name

UPDATE: (thanks to Jim Aho)

Recent versions work with -

ControllerContext.ActionDescriptor.ActionName

Upvotes: 26

dfmetro
dfmetro

Reputation: 4592

In ASP.NET Core it seems to have changed and you have to use the ActionName property

((Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor)ViewContext.ActionDescriptor).ActionName;

Upvotes: 14

andyw
andyw

Reputation: 41

The C# 5.0 CallerMemberName attribute may do the trick. (I haven't tested this from an async method; it works from a regular call)

private static string GetCallerMemberName([CallerMemberName]string name = "")
{
    return name;
}

Then call it from your code:

[HttpGet]
public async Task<IActionResult> CreateProcess(int catId)
{
    string methodName = GetCallerMemberName();

Note that you don't need to pass anything to the method.

Upvotes: 4

Ricardo Peres
Ricardo Peres

Reputation: 14555

Use the StackTrace class snd its GetFrames until you find the one you want.

Upvotes: 0

Related Questions