DefaultModelBinder espone un metodo pubblico: DefaultModelBinder.BindModel e un numero di metodo protetto disponibile per l'override. Tutti elencati nell'elenco here.
Oltre al modello, questi metodo riferiscono alle proprietà solo, non campi, come
- GetModelProperties,
- GetFilteredModelProperties,
- GetPropertyValue,
- OnXYZValidating,
- OnXYZValidated,
- OnXYZUpdating,
- OnXYZUpdated,
- GetXYZValue,
dove XYZ
sta per entrambi i Model,
o Property/ies,
o entrambi, e così via.
Come potete vedere, non vi è alcuno Fields
menzionato con questi nomi. Come Darin spiegato, nessuna modifica diretta allo stato del modello è tollerata dal Raccoglitore. Quindi no Field
nei suoi metodi.
E inoltre, si potrebbe desiderare di dare un'occhiata a un'altra classe importante: ModelBindingContext. Un'istanza di questa classe viene passata allo BindModel,
e successivamente a BindSimpleModel,
e BindComplexModel,
a seconda del tipo di modello (string, int,
... sono considerati semplici, tutto il resto è complesso).
Quindi, questo contesto ha le seguenti proprietà:
In altre parole, non è possibile fare riferimento ai campi nel ViewModel a meno che non si ignorino queste classi e si intraprendano azioni speciali per farlo.
Ma ancora, attenzione a combattere il framework, è sempre più facile seguirlo.
MODIFICA: La classe ModelMetadata contiene tutti i dati necessari per associare il modello. Il suo codice tuttavia non mostra alcun segno di campi, nomi di campi, ecc. Solo le proprietà sono referenziate e accessibili. Quindi, anche se si tenta di ereditare e sovrascrivere DefaultModelBinder e ModelBinderContext, ancora non sarà in grado di accedere fiellds, non importa quale sia il loro modificatore di accesso è: pubblico, privato, ecc
Spero che questo spiega la maggior parte di esso.
Ok, ma per questo avete i modificatori di accesso. Se non voglio che un campo sia impostato direttamente, lo dichiaro semplicemente 'privato'. Le classi Viewmodel sono normalmente solo datacontainer e per lo più non contengono molta logica, quindi ho pensato che fosse giusto usare solo i campi pubblici. – Jan
@Jan, normalmente i campi devono essere privati. –
E normalmente non dovresti avere una logica nei getter delle proprietà ... – gdoron