2009-12-22 11 views
7

Il mio modello è come questopersonalizzato legante per il modello di proprietà interiore

public class MyModel 
{ 
    string ID {get;set;} 
    string Title {get;set;} 
    MyOtherModel Meta {get;set;} 
} 

Come definire modello personalizzato legante per tipo (MyOtherModel) in modo che quando legante di default si lega MyModel chiama legante modello personalizzato per la proprietà 'Meta'. ho registrato in App Iniziamo come:

ModelBinders.Binders[typeof(MyOtherModel)] = new MyCustomBinder(); 

, ma questo non funziona. Qualche idea o qualche buon articolo con più informazioni riguardo ai modellisti?

+0

Che cosa non funziona? Hai provato a inserire un punto di interruzione nel tuo raccoglitore personalizzato per verificare se il raccoglitore è stato associato correttamente? Io di solito uso la sintassi ModelBinders.Bonders.Add (typeof (MyOtherModel), new MyCustomBinder()) – Mac

risposta

1

C'è un articolo su collezioni che tocca un po 'il complesso roba tipo di mappatura:

Collections and a bit about complex types

Nell'altra mano questo articolo potrebbe darvi alcuni consigli utili:

http://odetocode.com/Blogs/scott/archive/2009/04/27/6-tips-for-asp-net-mvc-model-binding.aspx

Ti suggerisco come soluzione per utilizzare un raccoglitore modello per la classe MyModel, non è una soluzione perfetta ma puoi refactor facilmente una volta che si scopre una soluzione migliore. :)

0

In realtà, se si vuole mettere in qualche Modifica/Crea vista con il modello della classe MyModel qualcosa di simile:

<%= Html.TextBox("Meta.Prop1") %> 

dove Prop1 è di proprietà della classe MyOtherModel, poi

UpdateModel(model); 

popolerà il valore della casella di testo sulla proprietà di sottomodulo personalizzata. E ancora, il valore della casella di testo verrà popolato con quel valore di sottomodello.

Quindi, una volta aggiornato il modello corrente, si aggiornano anche i sottomodelli.

+0

Non funziona per me .. –

+0

Voglio dire che la Prop1 è nullo, non importa quale sia –

+0

Ho classe di annunci e classe Mappa . La mappa è una proprietà di Ad (da Linq a SQL). <% = Html.TextBox ("Map.Zoom", Model.Map.Zoom)%> sta funzionando correttamente e sta aggiornando la proprietà Zoom del modello mappa. Aggiungi FormCollection come parametro per la tua azione: public ActionResult Create (Form Forms Collection) e vedi quali campi stanno arrivando alla tua azione. Quindi possiamo controllare cosa non va. P.S. dovresti chiamare UpdateModel per il tuo modello principale. Tu sei? –

Problemi correlati