2012-07-18 10 views
9

Potrzebuję wyeksportować jakiś rodzaj danych (skompilować plik), aby dane nie były tworzone (renderowane) przez Widoki, ale przez czysty kod C#, ouside widok. Ale potrzebuję informacji o ModelMetadata.Jak uzyskać ModelMetadata poza kontekstem widoku?

Pytam też, jak zbudować ModelMetadata wewnątrz testów jednostkowych, dlatego też, poza poglądy?

+1

Tworzenie modelu domeny i manipulowanie nim za pośrednictwem sterownika. Nie jestem pewien, o co pytasz Czy możesz spróbować być bardziej klarownym? – Grixxly

+0

Odpowiedź od Darina (poniżej) jest bardzo bliska temu, czego potrzebuję, ale nie mogę wywołać funkcji FromLambdaExpression() skompilowanej przez "parametr ogólny" dla określonego typu. Mogę tylko określić typ w czasie wykonywania (dynamicznie). – Luciano

Odpowiedz

17

Zakładając, że model widok z niektórych metadanych:

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

można pobrać te metadane tak:

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

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

UPDATE:

Zgodnie z wnioskiem w komentarzach sekcja zawiera opis sposobu uzyskania metadanych, jeśli tylko typ jest znany w czasie wykonywania:

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

i jeśli chcesz uzyskać metadanych dla własności dziecka tylko podać nazwę właściwości:

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

Niestety, mogę tylko określić typ w czasie wykonywania. Czy sposób wywołania FromLambdaExpression() posiadające tylko klasy Type, może budowanie wyrażenie ręcznie? – Luciano

+0

@ Luciano, zobacz moją aktualizację. –

+0

Nice! Wielkie dzięki ! – Luciano

Powiązane problemy