2014-07-23 10 views
6

In un controller C#, ho una funzione definita con un parametro facoltativo che è impostato sul valore predefinito su null (vedere esempio di codice di seguito). La prima volta che la pagina viene caricata, la funzione viene chiamata e il filtro viene passato come oggetto inizializzato, nonostante il valore predefinito sia null. Mi piacerebbe che fosse nullo la prima volta che la pagina si carica. C'è un modo per fare questo?Parametri facoltativi in ​​C# - Impostazione predefinita di una classe definita dall'utente su null

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

    // Do other things... 
} 

Questa azione viene risolto mediante il seguente definizione della rotta:

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

Stai chiamando con un argomento? Probabilmente non lo chiami in un modo che permetta il parametro predefinito. – BradleyDotNET

+0

@BradleyDotNET, TimSchemelter, è un'azione MVC, il metodo viene chiamato dal framework MVC, non dal codice utente –

+1

Che aspetto ha la definizione del percorso? – adam0101

risposta

5

Il legante modello predefinito (DefaultModelBinder) creerà un'istanza di CustomFilterModel e quindi tentare di riempire l'oggetto con i dati della richiesta. Anche se il modello di modello predefinito non trova proprietà del modello nella richiesta, restituirà comunque il modello vuoto, quindi non otterrete mai un oggetto nullo per il parametro. Sembra che non ci sia nulla nella fonte [1] che restituirà un modello null.

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

0

Ecco il sostituto di 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 
{ 
    ... 
} 

Attenzione però che con il legante in atto è necessario anteporre il nome del parametro a qualsiasi proprietà interiore, per esempio ?filter.range=1 anziché ?range=1.

Problemi correlati