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.

Hasan Fahim
la source
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();
    }

}
Buildstarted
la source
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()
{
    ...
}
Carlos Muñoz
la source
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" };
}
RHicke
la source
2
C'est très intelligent :)
SRQ Coder
2

Essayez ce code:

public class ProductsController
 {

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

}
Prudent
la source
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.

Pradeep Yadav
la source
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.

Hrishikesh TT
la source