27 votes

Action MVC avec paramètres optionnels - quelle est la meilleure solution ?

Y a-t-il des avantages ou des 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
    }
}

OU

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

30voto

Darin Dimitrov Points 528142

Je n'ai jamais vu la signature de la deuxième action dans la pratique et je n'en vois pas l'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 ne s'agit pas d'un entier valide ( GET /somecontroller/action?x=abc ), la valeur de l'argument x sera nulle dans l'action et l'état du modèle 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 attribué.

Dans mes exemples, j'ai utilisé des requêtes GET avec des paramètres de chaîne de requête, mais il en va de même avec d'autres verbes HTTP. x était un paramètre d'itinéraire.

7voto

Robert Koritnik Points 45499

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

Pourquoi ne pas simplifier les méthodes d'action du contrôleur en supprimant les branches de code inutiles 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
}

C'est bien sûr possible, à condition de fournir le code très simple de RequiresRouteValuesAttribute sélecteur de méthode d'action. Vous trouverez le code dans cet article de blog qui fait exactement cela.

À mon avis, il s'agit de la meilleure solution possible à ce problème, car :

  1. Il simplifie le code en supprimant les branches inutiles
  2. Facilite la maintenance du code (en raison d'une moindre complexité)
  3. Etend le framework Asp.net MVC comme il le peut et le doit
  4. Conserve les types de paramètres tels qu'ils devraient être sans qu'il soit nécessaire de les rendre nullables.
  5. etc.

Quoi qu'il en soit. Tous les détails de cette technique sont expliqués en détail dans l'article lié.

7voto

Curt Points 42871

Vous ne devez spécifier la valeur du paramètre optionnel que s'il s'agit d'une valeur autre 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.

Toutefois, il convient de noter que s'il existe des paramètres non optionnels après ce paramètre dans la signature, alors null devrait être spécifiée dans l'appel.

Il est donc préférable de placer tous les paramètres optionnels à la fin de la signature.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X