Objectif d'ActionName


87

Quel est l'avantage de définir un alias pour une méthode d'action à l'aide de l'attribut "ActionName"? Je ne vois vraiment pas grand avantage à cela, en offrant à l'utilisateur la possibilité d'appeler une méthode d'action avec un autre nom. Après avoir spécifié l'alias, l'utilisateur peut appeler la méthode d'action uniquement en utilisant l'alias. Mais si cela est nécessaire, pourquoi l'utilisateur ne change-t-il pas le nom de la méthode d'action plutôt que de lui spécifier un alias?

J'apprécierais vraiment si quelqu'un peut me donner un exemple de l'utilisation de "ActionName" dans un scénario où il peut fournir un grand avantage ou il est préférable de l'utiliser.


La raison la plus courante est lorsque vous avez à la fois les méthodes GET et POST et que la signature est la même. voir la réponse de @Carlos Muñoz
RickAndMSFT

Réponses:


132

Il vous permet de démarrer votre action avec un nombre ou d'inclure tout caractère que .net n'autorise pas dans un identifiant. - La raison la plus courante est que cela vous permet d'avoir deux actions avec la même signature (voir les actions GET / POST Delete de tout contrôleur échafaudé)

Par exemple: vous pouvez autoriser les tirets dans le nom de votre action d'URL http://example.com/products/create-productvs http://example.com/products/createproductou http://example.com/products/create_product.

public class ProductsController {

    [ActionName("create-product")]
    public ActionResult CreateProduct() {
        return View();
    }

}

46
Il vous permet également d'utiliser des noms d'action qui pourraient être des méthodes Controller, comme View ou File.
gramme

@gram, ne pouvons-nous pas appeler une méthode normale sur un contrôleur sans spécifier un alias? Je pense que nous pouvons.
Hasan Fahim

2
Si vous vouliez nommer votre, Action View()vous auriez des problèmes car toutes les références à View()dans votre contrôleur actuel résoudraient à cela Actionplutôt qu'à la méthode de base sous-jacente. Donc, pour contourner cela, vous utiliseriez l' ActionNameattribut pour permettre l' Viewaction, mais en interne, vous l'appeleriez PublicViewou quelque chose de similaire.
Construit le

2
Je pense que vous devrez return View("CreateProduct")ou .NET ne manquera pas de trouver une vue telle que create-product.aspxou create-product.cshtml- Au moins mon code fonctionne comme ça.
Achilles

@gram Alors, comment faites-vous ça? Evidemment pas avec un attribut.
John

61

C'est également utile si vous avez deux actions avec la même signature qui devraient avoir la même URL.

Un exemple simple:

public ActionResult SomeAction()
{
    ...
}

[ActionName("SomeAction")]
[HttpPost]
public ActionResult SomeActionPost()
{
    ...
}

Cela a du sens, mais dans quels scénarios utilisez-vous HttpPost sans paramètres? Je sais qu'il existe des raisons possibles, comme retourner JSON et éviter les problèmes de sécurité avec GET. Je me demande simplement ce que vous êtes.
regularmike

2
La liste des paramètres n'est pas la partie importante ici. Il y a peut-être un meilleur exemple, le fait est que vous pouvez le faire si vous en avez besoin.
Carlos Muñoz

1
nous pouvons faire cela en remplaçant "SomeActionPost" par "SomeAction" également, alors quelle est l'utilité de ActionName ??
Jilani pasha

Vous ne pouvez pas nommer les deux méthodes de la même manière si elles ont les mêmes paramètres. Dans ce cas, [ActionName] renomme l'action (pas la méthode) comme enregistrée dans ASP. NET MVC à la table de routage prévue.
Carlos Muñoz

38

Je l'utilise lorsque l'utilisateur télécharge un rapport afin qu'il puisse ouvrir facilement son fichier csv directement dans Excel.

[ActionName("GetCSV.csv")]
public ActionResult GetCSV(){
    string csv = CreateCSV();
    return new ContentResult() { Content = csv, ContentEncoding = System.Text.Encoding.UTF8, ContentType = "text/csv" };
}

2
C'est très intelligent :)
SRQ Coder

2

Essayez ce code:

public class ProductsController
 {

    [ActionName("create-product")]
    public ActionResult CreateProduct() 
    {
        return View("CreateProduct");
    }

}

1

Cette classe représente un attribut utilisé pour le nom d'une action. Il permet également aux développeurs d'utiliser un nom d'action différent du nom de la méthode.


0

Il est également utile lorsque vous devez implémenter une surcharge de méthode.

 public ActionResult ActorView()
        { 

            return View(actorsList);
        }


        [ActionName("ActorViewOverload")]
        public ActionResult ActorView(int id)
        {              
            return RedirectToAction("ActorView","Home");
        }
`

Ici, un ActorView n'accepte aucun paramètre et l'autre accepte int. La première méthode utilisée pour afficher la liste des acteurs et l'autre est utilisée pour afficher la même liste d'acteurs après la suppression d'un élément avec un ID comme «id». Vous pouvez utiliser le nom de l'action comme «ActorViewOverload» chaque fois que vous avez besoin d'une surcharge de méthode.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.