2012-07-18 11 views
9

Ho bisogno di esportare qualche tipo di dati (creare un file), quindi i dati non saranno prodotti (renderizzati) da Views ma da puro codice C#, o da una vista. Ma ho bisogno di alcune informazioni ModelMetadata.Come ottenere ModelMetadata al di fuori di un contesto di visualizzazione?

Mi chiedo anche come creare un ModelMetadata all'interno dei test di unità, quindi anche all'esterno di Views?

+1

Crea il tuo modello di dominio e manipolarlo tramite il controller. Non sono sicuro di cosa stai chiedendo, puoi provare ad essere più chiaro? – Grixxly

+0

La risposta di Darin (sotto) è molto vicina a ciò di cui ho bisogno, ma non posso chiamare FromLambdaExpression() compilato da "param param" per un tipo specifico. Posso solo determinare il tipo in runtime (dinamicamente). – Luciano

risposta

17

Supponendo di avere un modello di vista con alcuni metadati:

public class MyViewModel 
{ 
    [DisplayName("Bar")] 
    public string Foo { get; set; } 
} 

si potrebbe recuperare questi metadati come questo:

ModelMetadata metadata = ModelMetadata.FromLambdaExpression<MyViewModel, string>(
    x => x.Foo, 
    new ViewDataDictionary<MyViewModel>() 
); 

Assert.AreEqual("Bar", metadata.DisplayName); 

UPDATE:

Come richiesto nei commenti la sezione qui è come ottenere i metadati se solo il tipo è noto in fase di esecuzione:

var type = typeof(MyViewModel); 
var metadata = ModelMetadataProviders.Current.GetMetadataForType(null, type); 

e se si desidera ottenere i metadati per una proprietà bambino solo specificare il nome della proprietà:

var type = typeof(MyViewModel); 
var metadata = ModelMetadataProviders.Current.GetMetadataForProperty(null, type, "Foo"); 
+0

sfortunatamente posso determinare solo il tipo in runtime. È un modo per chiamare FromLambdaExpression() avendo solo una classe Type, magari costruendo un'espressione manualmente? – Luciano

+0

@Luciano, vedere il mio aggiornamento. –

+0

Bello! Grazie molto ! – Luciano

Problemi correlati