2009-06-09 13 views
36

Ho un tipo:ASP.NET MVC - miscelazione su misura e modello predefinito Binding

public class IssueForm 
{ 
    Order Order {get; set;} 
    Item Item {get; set;} 
    Range Range {get; set;} 
} 

Ho creato un modello personalizzato legante a causa dei requisiti di ordine ed elemento, ma Gamma potrebbero ancora utilizzare il modello Binder predefinito.

C'è un modo all'interno del mio modello di modello personalizzato per chiamare il modello di modello predefinito per restituire un oggetto Range? Penso che dovrei semplicemente installare ModelBindingContext correttamente, ma non so come.


EDIT

Guardando il primo commento e la risposta - sembra che eredita da legante modello predefinito potrebbe essere utile.

Per aggiungere più specifiche per il mio setup finora ho:

public IssueFormModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     Order = //code to pull the OrderNumber from the context and create an Order 
     Item = //code to pull the ItemNumber from the context and create an Item 

     IssueForm form = IssueFormFactory.Create(Order, Item); 

     form.Range = // ** I'd like to replace my code with a call to the default binder ** 

     return form 
    } 
} 

Questo potrebbe essere un modo stupido di farlo ... questo è il mio primo legante modello. Basta sottolineare la mia attuale implementazione.


EDIT # 2

Quindi le risposte per ignorare BindProperty funziona se posso collegare in come un metodo "Sto tutto fatto vincolante" e chiamare il metodo di fabbrica con le proprietà.

Immagino che dovrei davvero considerare l'implementazione di DefaultModelBinder e smettere di essere stupido.

+1

Non sono sicuro che sia la soluzione più elegante, ma potresti derivare il tuo modello personalizzato da DefaultModelBinder anziché implementare IModelBinder? Quindi, quando si esegue l'override di BindModel, passare la responsabilità a DefaultModelBinder, laddove appropriato. Altrimenti, usa l'associazione personalizzata. –

+0

Sì, sto vedendo alcuni legatori di modelli uscire da IModelBinder e DefaultModelBinder. Immagino che DefaultModelBinder abbia alcuni metodi extra che presumo chiamino dal metodo BindModel, quindi puoi concentrare maggiormente le tue esigenze? – anonymous

+0

Conferma solo la mia decisione di ignorare ModelBinder e l'elaborazione dell'inserimento del codice e la convalida manualmente. Ora l'ho coerente, trasparente e adattabile alle esigenze future presenti e immaginabili. – User

risposta

24

provare qualcosa di simile:

public class CustomModelBinder : DefaultModelBinder { 
    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) { 
     if(propertyDescriptor.Name == "Order") { 
      ... 
      return; 
     } 

     if(propertyDescriptor.Name == "Item") { 
      ... 
      return; 
     } 

     base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
    } 

} 
+0

Qui probabilmente sono stupido ma come si implementa la classe CustomModelBinder, sicuramente è necessario creare un'istanza da qualche parte affinché funzioni? Forse come attributo nei parametri ActionResult? –

49

di override del BindProperty dal DefaultModelBinder:

public class CustomModelBinder:DefaultModelBinder 
     { 
      protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor) 
      { 
       if (propertyDescriptor.PropertyType == typeof(Range)) 
       { 
        base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
       } 
       // bind the other properties here 
      } 
     } 
+20

+1 per il tipo di proprietà inspedcting anziché il nome. Incolpare le stringhe magiche! –

6

penso che avrei registrato due leganti diversi modelli personalizzati, uno per Ordine e uno per la voce, e lasciare che il raccoglitore modello predefinito gestisca l'intervallo e il problema.

+4

Sì, ovviamente è passato un po 'da quando ho fatto questa domanda. Ho finito per esaminare il codice DefaultModelBinder e realizzare la natura ricorsiva del binding del modello. Non mi rendevo conto che con un tipo complesso contenente altri tipi complessi potevo semplicemente definire un legatore di modelli per ognuno di essi individualmente. Ho invece pensato che il genitore complesso avrebbe dovuto conoscere i dettagli di ogni bambino complesso. – anonymous

Problemi correlati