2011-01-17 1 views
4

Ich versuche DataAnnotation Werte in ASP.NET MVC Index Ansicht zu nutzen. Interessant, verwendet der Code-Generator Feldnamen (z. B. BlogPost) im Gegensatz zu Html.LabelFor(m => Model.ColumNames["BlogPost"]) oder etwas ähnliches (ich habe es erfunden).Ist es möglich, LabelFor für die Kopfzeile in der Indexansicht zu verwenden

Bedeutet es, dass wenn das Modell IEnumerable ist (wie in der Indexansicht), es nicht möglich ist, zu dem Anzeigenamen zu gelangen, der von DataAnnotation angegeben wird? Kaum zu glauben ...

Mein Code ist derzeit eine Mischung aus MVC 2 und MVC 3, wenn es einen Unterschied macht.

Antwort

14

Sie sollten zumindest in der Lage sein, mit einer Teilansicht (ascx für WebForms) oder einer Anzeige/Editor-Vorlage zu erhalten, was Sie wollen. In Ihrer Indexseite können Sie Ihre Aufzählungen durchlaufen und das Element entweder in eine Teilansicht oder eine Vorlage übergeben.

Es kann einen Weg geben, es zu tun, ohne zu tun, was ich vorgeschlagen habe (und ich wäre daran interessiert, die Antwort zu sehen), aber was ich vorgeschlagen habe, sollte gut funktionieren.

EDIT:

Nach einiger Klärung, hier ist meine Antwort aktualisiert.

Sie können immer noch die Bezeichnung für eine Eigenschaft erhalten, während Sie immer noch die DisplayAttribute in Datenanmerkungen beachten. Ich habe es schnell versucht und es scheint gut zu funktionieren.

Aus meiner Sicht habe ich folgendes:

Html.LabelFor(m => m.BlogPosts.First().BlogPostTitle) 

Das funktionierte auch wenn es keine Elemente sich in der Aufzählung waren. Als ich das zuerst getestet habe, bekam ich den Namen der Eigenschaft, dann fügte ich die Eigenschaft mit der DisplayAttribute hinzu und der Wert der name -Eigenschaft wurde anstelle des Standard-Eigenschaftsnamens angezeigt.

+0

danke, aber ich denke, du hast meine Frage missverstanden. Das Problem ist * nicht *, wie man aufzählbar überläuft. Das Problem besteht darin, wie Anzeigenamen in der * Kopfzeile * in der Indexansicht angezeigt werden (wo ich eine Tabelle mit Werten aus der DB zeige) - also ** bevor ** ich mit dem Schleifen begonnen habe. Mir ist nicht klar, wie partielle Ansicht oder Display-Vorlage auf die Frage zutrifft. – Felix

+0

Sie haben Recht, ich habe falsch verstanden. Ich wusste nicht, dass Sie in einem Tabellenformat aufgelistet sind. Ich habe einige davon untersucht und ich glaube, wenn Sie antworten. Ich werde meine Antwort ändern, um diese neuen Informationen aufzunehmen. –

+1

Hmm ... Ich kann schwören, dass ich ein Problem hatte, als ich First() ausprobierte. Entweder war das Problem mit einem leeren Satz oder es verschlang die Reihe, oder ich konnte nicht zwei First() im Header haben oder ich rauchte etwas Illegales. Auf jeden Fall funktioniert es gut. Übrigens, du meintest wahrscheinlich DisplayName, nicht DisplayAttribute. – Felix

4

In MVC 4 ermöglicht die HtmlHelper extensions in the DisplayNameExtensions class die folgende (dies ist die Standard Gerüst einer Liste mit Spaltenüberschriften)

@model IEnumerable<Entity.Foo> 

<table> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.Bar) 
     </th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Bar) 
     </td> 
... 

Dies liegt daran, DisplayNameFor Überlastungen sowohl für TModel und IEnumerable<TModel> hat:

public static MvcHtmlString DisplayNameFor<TModel, TValue> 
         (this HtmlHelper<IEnumerable<TModel>> html, 
         Expression<Func<TModel, TValue>> expression); 
    public static MvcHtmlString DisplayNameFor<TModel, TValue> 
         (this HtmlHelper<TModel> html, 
         Expression<Func<TModel, TValue>> expression); 
+1

Nice find, Code-Vervollständigung scheint nicht mit der IEnumerable-Überladung zu arbeiten, so dass es leicht zu übersehen ist. – Stijn

+0

Dies funktioniert nur, wenn Ihr Ansichtsmodell selbst ein IEnumerable ist, z. B. in den Ansichten, die vom Scaffolding-Framework generiert werden.Dies ist eine schlechte Vorgehensweise, da Sie bei der Verwendung von speziellen Ansichtsmodellklassen bleiben sollten. – Monstieur