2014-07-23 5 views
6

Dans un contrôleur C#, j'ai une fonction définie avec un paramètre optionnel qui est défini par défaut sur null (voir l'exemple de code ci-dessous). Lors du premier chargement de la page, la fonction est appelée et le filtre est transmis en tant qu'objet initialisé, bien que la valeur par défaut soit null. Je voudrais qu'il soit nul la première fois que la page se charge. Y a-t-il un moyen de faire cela?Paramètres facultatifs en C# - Valeur par défaut définie par défaut

public ActionResult MyControllerFunction(CustomFilterModel filter = null) 
{ 
    if (filter == null) 
     doSomething(); // We never make it inside this "if" statement. 

    // Do other things... 
} 

Cette action est résolue par la définition de l'itinéraire suivant:

routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Project", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 
+0

L'appelez-vous avec un argument? Vous ne l'appelez probablement pas d'une manière qui autorise le paramètre par défaut. – BradleyDotNET

+0

@BradleyDotNET, TimSchemelter, c'est une action MVC, la méthode est appelée par le framework MVC, pas par le code utilisateur –

+1

A quoi ressemble votre définition de route? – adam0101

Répondre

5

Le modèle de liaison par défaut (DefaultModelBinder) va créer une instance de CustomFilterModel et ensuite tenter de remplir l'objet avec les données de la demande. Même si le classeur de modèle par défaut ne trouve aucune propriété de votre modèle dans la requête, il renverra toujours le modèle vide, par conséquent vous n'obtiendrez jamais un objet nul pour votre paramètre. Il semble qu'il n'y ait rien dans la source [1] qui retournera un modèle nul.

[1] https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/DefaultModelBinder.cs

0

Voici le remplacement pour DefaultModelBinder:

public class OptionalClassInstanceBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     bindingContext.FallbackToEmptyPrefix = false; 
     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

[ModelBinder(typeof(OptionalClassInstanceBinder))] 
public class CustomFilterModel 
{ 
    ... 
} 

Prenez garde cependant qu'avec le liant en place, vous devez préfixer le nom du paramètre à une propriété intérieure, par exemple ?filter.range=1 au lieu de ?range=1.