web-dev-qa-db-fra.com

ASP .NET MVC NonAction sens

Quelqu'un peut-il me dire pourquoi devrais-je utiliser NonAction? Je veux dire que j'ai un formulaire avec plusieurs valeurs de soumission: Mettre à jour, supprimer ou insérer. Étant donné que tous les boutons de soumission ont la même forme en commun, je change la valeur de soumission à l'intérieur du contrôleur et agis en conséquence.

Comme ça:

public ActionResult asd(string submitButton){
     switch(submitButton){
         case "Insert":
             return Insert();
         // bla bla bla
     }
}

[NonAction]
public ActionResult Insert(){
    // some code inside here
    return View();
}

Encore une fois, pourquoi devrais-je utiliser NonAction au lieu de quelque chose comme ça:

public void Insert(){
    // some code inside here
}
35
Shaokan

Vous pouvez omettre l'attribut NonAction mais la méthode est toujours invocable comme méthode d'action.

Depuis le site MSDN ( ref ):

Par défaut, le framework MVC traite toutes les méthodes publiques d'une classe de contrôleur comme des méthodes d'action. Si votre classe de contrôleur contient une méthode publique et que vous ne voulez pas qu'il s'agisse d'une méthode d'action, vous devez marquer cette méthode avec l'attribut NonActionAttribute.

50
ReFocus

Il convient de noter que la nécessité d'utiliser [NonAction] S'applique uniquement aux méthodes publiques. Les méthodes protégées et privées ne sont pas traitées comme des actions. Puisque vos méthodes Update/Delete/Insert sont des aides pour asd(), une méthode privée serait plus appropriée pour votre scénario:

public ActionResult asd(string submitButton){
    switch(submitButton){
        case "Insert":
            return Insert();
        // bla bla bla
    }
}

ActionResult Insert(){
    // some code inside here
}
13
Taudris

Lecture de l'article de Haack

Toute méthode publique dans une classe de contrôleur peut être appelée via URL.

Parfois, vous devrez peut-être éviter cela. Par exemple, si vous implémentez une interface et que vous ne souhaitez pas appeler cette méthode publique, vous pouvez marquer comme NonAction

public interface IEmployee
{
 void Save(Employee e);
 bool Validate(Employee e);
}

public class EmployeeController:Controller, IEmployee
{
  public void Save(Employee e){
  }

  [NonAction]
  public void Validate(Employee e){
  }
}
5
Murali Murugesan

Si vous n'utilisez pas l'attribut [NonAction], quelqu'un peut appeler votre action directement au lieu d'avoir à passer par la fonction 'asd'

5
devprog

L'attribut NonAction rend une action non accessible à partir de la barre de navigation. Par exemple, si vous avez une action qui supprime des éléments dans la base de données, vous devez ajouter l'attribut NonAction pour le rendre inaccessible aux utilisateurs.

2
Bilel Chaouadi

Je viens d'utiliser [NonAction] dans notre API Web, pour décorer un tas de méthodes de contrôleur (points de terminaison) parce que nous avons décidé de dernière minute de reporter la livraison des points de terminaison spécifiques.

Il est donc utile, si vous souhaitez éviter d'exposer un point de terminaison API, mais que vous souhaitez conserver l'implémentation pour plus tard.

J'ai donc utilisé cet attribut et cela m'a fait gagner beaucoup de temps.

Je vais juste le supprimer dans la prochaine version et ce sera simplement là!

2
cnom

Ceci indique qu'une méthode de contrôleur n'est pas une méthode d'action. Exemple: [NonAction] public void IndexTest () {// Faites quelque chose} c'est un attribut très utile lorsque la visibilité de la méthode du contrôleur ne peut pas être changée en privée.

0
Ajeet Malviya

C'est un attribut qui est utilisé sur les méthodes définies par les modificateurs d'accès public. En fait, MVC Framework traite toutes les méthodes publiques comme des URL, mais si vous ne le souhaitez pas, vous devez décorer une méthode avec l'attribut non action. La même chose peut être obtenue en rendant la méthode privée.

Un exemple d'attribut NonAction est donné ci-dessous. http://yogeshdotnet.com/non-action-attribute-in-mvc/

0
Yogesh Sharma

Tout d'abord, considérez un ActionResult simplement comme un type particulier de construction renvoyé par MVC, ce qui s'avère particulièrement pratique en termes de manière dont ActionResult peut être géré en interne dans le cadre MVC. Donc, le fait que quelque chose soit un ActionResult ne signifie pas nécessairement " cela devrait être accessible au public ". En fait, toute méthode publique dans un contrôleur MVC sera traitée comme une méthode d'action, qu'elle renvoie ou non un ActionResult.

Donc, avoir simplement un type de retour qui n'est pas un ActionResult ne sera pas empêchent nécessairement cette méthode d'être exposée en tant qu'action accessible au public pouvant être appelée via une URL.

Il peut y avoir de nombreuses raisons pour lesquelles vous ne souhaitez pas exposer une méthode en tant qu'action pouvant être invoquée via une URL, et dans le cas où vous souhaitez vous "protéger" contre cela, c'est lorsque vous utilisez l'attribut [NonAction "].

0
Chris Halcrow