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
}
}
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:
GET /somecontroller/action
), la valeur de l'argument x sera nulle dans l'actionGET /somecontroller/action?x=abc
), la valeur de l'argument x sera nulle dans l'action et le modelstate sera invalideGET /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.
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.
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:
En tous cas. Tous les détails sur cette technique sont expliqués en détail dans un article lié.