2012-04-04 21 views
12

Mi chiedo se esiste un modo per utilizzare il collegamento del modello incorporato simile al collegamento del modello interno che si verifica prima di un'azione del controllore.Associazione manuale del modello con .Net Mvc

Il mio problema è che voglio essere in grado di controllare il binding poiché non conoscerò il tipo di oggetto da legare fino a quando non sono effettivamente nel contesto dell'azione del controller.

ho capito che posso ereditare la DefaultModelBinder per eseguire personalizzato vincolante, ma sono felice con ciò che è già in offerta, e vogliono solo utilizzarlo - prendere questa ideale esempio per avere un'idea di quello che sto cercando :

public ActionResult DoCustomBinding(string modelType) 
{ 
    ... // logic to determine type to check and create strong 'actual' type 

    object model = BindModel(actualType); 

    ... // do something with bound model 

    return View(); 
} 

ho guardato in utilizzando il DefaultModelProvider ma non siete sicuri se questo è il modo giusto di andare su questo e non ero sicuro di come ottenere il ModelBindingContext.

+0

Hai ragione. È un comportamento scarso su un sito così utile, mi sono dato un ticchettio approfondito. –

+0

Cercherò di essere più specifico, il mio obiettivo finale è quello di essere in grado di convalidare una singola proprietà di una classe decorata con attributi di validazione. Quindi, armato solo di un nome stringa del tipo da controllare, nome (i) campo (i) e valore (i) - Mi piacerebbe essere in grado di legare il modello (che dovrò risolvere dal tipo) quindi eseguire controlli su di esso. –

+0

Ho intenzione di dare un'occhiata a ControllerActionInvoker http://aspnet.codeplex.com/SourceControl/changeset/view/72551#266452 sembra che potrebbe darmi un'idea di come è fatto internamente. –

risposta

0

Hai esaminato l'interfaccia di IModelBinder?

public class CustomModelsBinder : IModelBinder { 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { } 
} 

e quindi aggiungere questo al vostro file Global.asax:

protected override void OnApplicationStarted() { 
    ModelBinders.Binders.Add(typeof(CustomModels), new CustomModelsBinder()); 
} 
+0

Non proprio, e io uso già qualcosa di simile a lavorare con le enumerazioni. Voglio usare il motore interno e, come dire, ecco il tipo che voglio creare e associare, andare a creare e associarlo e riportare il risultato (al di fuori della normale routine di un'azione del controller). –

0

Se si desidera convalidare solo parti specifiche di un modello, questo potrebbe essere il duplicato di un domanda che in precedenza risposto MVC Partial Model Updates.

La parte interessante dell'utilizzo di System.ComponentModel.DataAnnotations.MetadataType consiste nel fatto che il raccoglitore modello continuerà a legarsi a un oggetto derivato di cui è fondamentalmente uguale all'oggetto di base, solo con metadati di visualizzazione/convalida diversi.

+0

Grazie - sembra utile, sono appena riuscito a far funzionare il binding, quindi ho un paio di soluzioni che posso guardare ora ... –

Problemi correlati