ASP.NET MVC: Zugriff auf ModelMetadata für Elemente in einer Auflistung
-
19-09-2019 - |
Frage
Ich versuche, einen Auto-scaffolder für Index Ansichten zu schreiben. Ich möchte in einer Sammlung von Modellen oder View-Modellen (zB IEnumerable<MyViewModel>
) und eine HTML-Tabelle zurück zu übergeben können, die das DisplayName
Attribut für die Überschriften (th
Elemente) und Html.Display(propertyName)
für die Zellen (td
Elemente) verwendet . Jede Zeile soll in der Sammlung zu einem Punkt entsprechen.
Wenn ich nur einen einzelnen Datensatz, wie es in einer Detailansicht angezeigt wird, verwende ich ViewData.ModelMetadata.Properties
die Liste der Eigenschaften für ein bestimmtes Modell zu erhalten. Aber was passiert, wenn das Modell, das ich zu der Ansicht, passiere eine Sammlung von Modell oder View-Modell-Objekten und nicht ein Modell oder View-Modell selbst?
Wie erhalte ich die ModelMetadata für ein bestimmtes Element in einer Sammlung?
Lösung
Eine einfache Erweiterung Methode könnte die Arbeit tun:
public static class MyExtensions
{
public static ModelMetadata GetMetadata<TModel>(this TModel model)
{
return ModelMetadataProviders.Current.GetMetadataForType(null, typeof(TModel));
}
}
Und in der Ansicht:
<%@ Page
Language="C#"
Inherits="System.Web.Mvc.ViewPage<System.Collections.Generic.IEnumerable<MyViewModel>>" %>
<%-- Get metadata for the first item in the model collection --%>
<%= Html.Encode(Model.ElementAt(0).GetMetadata().ModelType) %>