web-dev-qa-db-fra.com

Action MVC avec paramètres facultatifs - quel est le meilleur?

Y a-t-il des avantages/inconvénients à utiliser les deux alternatives suivantes dans votre signature d'action:

public ActionResult Action(int? x) // get MVC to bind null when no parameter is provided
{
    if(x.HasValue)
    {
        // do something
    }
}

OR

public ActionResult Action(int? x = null) // C# optional parameter (virtual overload)
{
    if(x.HasValue)
    {
        // do something
    }
}
27
Zaid Masud

Je n'ai jamais vu la deuxième signature d'action dans la pratique et je ne vois aucune utilité.

Le premier couvre généralement tous les scénarios:

  • Si aucun paramètre n'est envoyé (GET /somecontroller/action), la valeur de l'argument x sera nulle dans l'action
  • Si un paramètre x est envoyé, mais qu'il n'est pas un entier valide (GET /somecontroller/action?x=abc), la valeur de l'argument x sera nulle dans l'action et le modelstate sera invalide
  • Si un paramètre x est envoyé et que la valeur représente un entier valide (GET /somecontroller/action?x=123), alors x lui sera affecté.

Dans mes exemples, j'ai utilisé des requêtes GET avec des paramètres de chaîne de requête, mais la même chose s'applique évidemment aux autres verbes HTTP et si x était un paramètre de route.

29
Darin Dimitrov

Vous devez uniquement spécifier la valeur du paramètre facultatif si elle va être autre chose que null.

MVC3 définira automatiquement null comme valeur de votre paramètre si rien n'est spécifié dans la surcharge ou dans l'appel à l'action.

Cependant, il vaut la peine de noter que s'il y a des paramètres non facultatifs après ce paramètre dans la signature, alors null devra être spécifié dans l'appel.

Par conséquent, il est préférable de mettre tous les paramètres facultatifs à la fin de la signature.

7
Curt

Meilleure solution Asp.net MVC - utilisez le sélecteur de méthode d'action

Pourquoi ne pas simplifier les méthodes d'action du contrôleur en supprimant la branche de code inutile et avoir ce type de code comme on le voit ici:

public ActionResult Index()
{
    // do something when there's no id
}

[RequiresRouteValues("id")]
public ActionResult Index(int id)
{
    // do something when id is present
}

Ceci est bien sûr possible, tant que vous fournissez le code très simple pour le sélecteur de méthode d'action RequiresRouteValuesAttribute. Vous pouvez trouver du code dans cet article de blog qui fait exactement cela.

À mon avis, c'est la meilleure solution possible à ce problème, car:

  1. Il simplifie le code en supprimant la branche inutile
  2. Rend le code plus facile à maintenir (en raison d'une complexité moindre)
  3. Étend le framework Asp.net MVC comme il peut et devrait
  4. Conserve les types de paramètres tels qu'ils devraient être sans qu'il soit nécessaire de les rendre nullables
  5. etc.

En tous cas. Tous les détails sur cette technique sont expliqués en détail dans un article lié.

6
Robert Koritnik