Ich glaube, das ist ziemlich einfach. Ich kann einfach nicht den richtigen Weg finden, um den Anzeigenamen für ein Element in einer Liste in meinem Modell anzuzeigen.
Mein vereinfachtes Modell:
public class PersonViewModel
{
public long ID { get; set; }
private List<PersonNameViewModel> names = new List<PersonNameViewModel>();
[Display(Name = "Names")]
public List<PersonNameViewModel> Names { get { return names; } set { names = value; } }
}
und Namen:
public class PersonNameViewModel
{
public long ID { get; set; }
[Display(Name = "Set Primary")]
public bool IsPrimary { get; set; }
[Display(Name = "Full Name")]
public string FullName { get; set; }
}
Jetzt möchte ich eine Tabelle erstellen, in der alle Namen einer Person angezeigt werden, und den Anzeigenamen für den vollständigen Namen erhalten. Offensichtlich,
@Html.DisplayNameFor(model => model.Names.FullName);
würde nicht funktionieren, und
@Html.DisplayNameFor(model => model.Names[0].FullName);
wird brechen, wenn es keine Namen gibt. Gibt es hier einen "besten Weg", um den Anzeigenamen zu erhalten?
quelle
List<PersonNameViewModel>
haben . Ist das richtig? Trotzdem denke ich, dass mir das Beispiel am besten gefällt . Andernfalls könnten Sie mehrere Eigenschaften haben, die Sie eingeben oder einfügen müssen . Andererseits sollten Sie den Abschnitt möglicherweise in eine Teilansicht umgestalten, die das oder als Modell akzeptiert .IEnumerable<PersonNameViewModel>
model => model.Names.First().FullName
dummyModel
model.Names[0].
List
IEnumerable
FirstOrDefault()
arbeite mit einer leeren Liste.Es gibt noch einen anderen Weg, und ich denke, das ist klarer:
Und dann in der Ansicht:
quelle
Ich mag die Lösung von T-moty. Ich brauchte eine Lösung mit Generika, daher lautet meine Lösung im Wesentlichen:
Die Verwendung in der Ansicht entspricht seinem Beispiel. Ich erstelle eine einzelne Instanz eines leeren Objekts, damit ich nicht jedes Mal eine neue Instanz erstelle, wenn ich auf Standard verweise .
Beachten Sie, dass die Einschränkung new () benötigt wird, um new T () aufzurufen . Wenn Ihre Modellklasse keinen Standardkonstruktor hat oder Sie dem Konstruktor Argumente hinzufügen müssen, können Sie Folgendes verwenden:
Die Ansicht hat eine @ Modellzeile wie:
quelle
DisplayNameFor
niemals dieget
for-Eigenschaft aufgerufen wird, sodass es keine Rolle spielt, ob Sie eine Instanz erstellen.Als alternative Lösung können Sie Folgendes versuchen:
Es wird auch funktionieren, wenn die Liste leer ist!
quelle