2012-07-18 9 views
9

Necesito exportar algún tipo de datos (compilar un archivo), por lo que los datos no serán producidos (renderizados) por Vistas sino por código C# puro, fuera de una vista. Pero necesito algunas informaciones de ModelMetadata.¿Cómo obtener ModelMetadata fuera del contexto de una vista?

Pregunto también cómo construir un ModelMetadata dentro de las pruebas unitarias, ¿y también fuera de Views?

+1

Crear su modelo de dominio y manipularlo mediante su controlador. No estoy seguro de lo que estás preguntando ¿puedes tratar de ser más claro? – Grixxly

+0

La respuesta de Darin (abajo) está muy cerca de lo que necesito, pero no puedo llamar FromLambdaExpression() compilado por "param genérico" para un tipo específico. Solo puedo determinar el tipo en tiempo de ejecución (dinámicamente). – Luciano

Respuesta

17

Asumiendo que tiene un modelo de vista con algunos metadatos:

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

se podía recuperar estos metadatos como esto:

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

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

ACTUALIZACIÓN:

a lo solicitado en los comentarios A continuación, se muestra cómo obtener los metadatos si solo se conoce el tipo en tiempo de ejecución:

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

y si desea obtener los metadatos de una propiedad hijo acaba de especificar el nombre de la propiedad:

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

desafortunadamente solo puedo determinar el tipo en tiempo de ejecución. ¿Es una forma de llamar a FromLambdaExpression() teniendo solo una clase Type, tal vez construyendo una Expression manualmente? – Luciano

+0

@Luciano, mira mi actualización. –

+0

¡Agradable! Muchas gracias ! – Luciano

Cuestiones relacionadas