2010-12-18 3 views
5

In meiner MVC2-AdminArea möchte ich eine Übersichtstabelle für jedes meiner Domänenmodelle erstellen. Ich verwende DataAnnotations wie folgt für die Eigenschaften dieser Domäne Modellobjekte:DataAnnotations aus einer Sammlung von Modellen in einer MCV2-Ansicht lesen

[DisplayName("MyPropertyName")] 
public string Name { get; set; } 

Nun meine Frage: Wie kann ich die Displayeigenschaften zugreifen, wenn meine Ansicht, welche eine Sammlung meiner Domain-Modelle erhält? Ich brauche das, um die Tabellenköpfe zu erstellen, die außerhalb der üblichen Schleife definiert sind. Innerhalb dieser Schleife kann ich schreiben

aber gibt es eine Möglichkeit, Zugriff auf diese Informationen mit der Sammlung von Elementen anstelle einer konkreten Instanz?

Vielen Dank im Voraus!

+0

Ihr Modell stongly getippt, wie 'Liste '? – marcind

+0

Ja, es ist ein IEnumerable . – Shackles

Antwort

2

Es gibt eine ModelMetaData Klasse mit einer statischen Methode namens FromLambdaExpression. Wenn Sie es anrufen und Ihre Immobilie zusammen mit Ihrer ViewData übergeben, wird eine Instanz von ModelMetaData zurückgegeben. Diese Klasse hat eine DisplayName Eigenschaft, die Ihnen geben sollte, was Sie brauchen. Sie können auch andere Metadateninformationen von diesem Objekt erhalten.

Zum Beispiel können Sie ein leeres Objekt ViewDataDictionary erstellen, um diese Informationen zu erhalten. Es kann leer sein, da die ModelMetaData die Instanz nicht tatsächlich verwendet, sondern nur die generische Klasse benötigt, um den verwendeten Typ zu definieren.

//This would typically be just your view model data.  
ViewDataDictionary<IEnumerable<Person>> data = new ViewDataDictionary<IEnumerable<Person>>(); 

ModelMetadata result = ModelMetadata.FromLambdaExpression(p => p.First().Name, data); 
string displayName = result.DisplayName; 

Der First() Methodenaufruf auch dann nicht brechen, wenn Sie kein tatsächliches Person Objekt haben, weil das Lambda einfach versucht, die Eigenschaft, die Sie die Meta-Daten zu wollen finden. In ähnlicher Weise könnte man d dies für ein einzelnes Objekt Person:

//This would typically be just your view model data.  
ViewDataDictionary<Person> data = new ViewDataDictionary<Person>(); 

ModelMetadata result = ModelMetadata.FromLambdaExpression(p => p.Name, data); 

könnten Sie diese aufzuräumen deutlich mit einem Helfer oder Extension-Methode, aber das sollte man auf dem richtigen Weg.

+0

Vielen Dank für Ihre Antwort. Das funktioniert gut, aber ich frage mich, ob ich dies automatisch für eine Reihe von Modelleigenschaften tun kann (kann ich irgendwie über alle Eigenschaften iterieren?). Ich möchte kein Wörterbuch mit allen DisplayNames erstellen, die ich in meiner Ansicht anzeigen möchte. – Shackles

0

In Ordnung, ich folgte sgriffinusa der Beratung (nochmals vielen Dank!) Und erstellt einen stark typisierte Htmlhelper:

public static MvcHtmlString MetaDisplayName<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) where TModel : class 
{ 
    ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
    return MvcHtmlString.Create(metadata.GetDisplayName()); 
} 

Natürlich TModel noch eine Sammlung von Domain-Modellen wie in meiner inital Frage angegeben, aber wir können der Helfer in der Ansicht wie folgt aus:

<%: Html.MetaDisplayName(p => p.First().Name) %>