web-dev-qa-db-fra.com

Comment obtenir le nom actuel de la méthode du contrôleur principal ASP.NET dans le contrôleur à l'aide de Reflection ou d'une autre méthode précise

Je veux obtenir le nom de méthode actuel de mon contrôleur ASP.NET Core

J'ai essayé d'obtenir le nom de la méthode par réflexion: 

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

mais cela me donne une valeur de MoveNext et non CreateProcess

Prenez note que je ne veux pas utiliser le ViewContext

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

comme je minuscule mes urls via les paramètres de démarrage. Ce qui précède va me donner createprocess au lieu de CreateProcess

Je préfère de préférence une méthode simple à une ligne et non une méthode d’extension multiligne.

11
devfric

Vous pouvez utiliser le fait que ce n'est pas n'importe quelle méthode mais un contrôleur et utiliser la propriété ActionContext.ActionDescriptor.Name pour obtenir le nom de l'action

MISE À JOUR: (merci à Jim Aho)

Les versions récentes fonctionnent avec - 

ControllerContext.ActionDescriptor.ActionName
16
Felix Av

Dans ASP.NET Core, cela semble avoir changé et vous devez utiliser la propriété ActionName.

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

L'attribut CallerMemberName C # 5.0 peut faire l'affaire. (Je n'ai pas testé cela à partir d'une méthode asynchrone; cela fonctionne à partir d'un appel normal)

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

Puis appelez-le depuis votre code:

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

Notez que vous n'avez rien besoin de transmettre à la méthode.

2
andyw

Utilisez la classe Stack Trace et ses GetFrames jusqu'à ce que vous trouviez celui que vous voulez.

0
Ricardo Peres

Vous pouvez l'obtenir par base.ControllerContext.ActionDescriptor.ActionName

Cela fonctionne dans .NET Core 1.0.

0
Jim Aho