MVC und Entity Framework Html.DisplayNameFor mit Composite ViewModel

Ich bin mit MVVM unter Verwendung von WPF / Silverlight ziemlich vertraut, aber dies ist mein erster Versuch mit einer MVC-Webanwendung ... nur eine Info für meinen Hintergrund.

Ich habe einen Controller mit dem Namen TestSitesController erstellt, der automatisch aus der Modellklasse "Site" in meinem Entity Framework-Modell generiert wurde (der Vorlage, die die Lese- / Schreibaktionen und -ansichten generiert). Das einzige, was ich geändert habe, war an 3 Stellen, dass es für einige Methoden einen Standardparameter von Guid id = null gab. Ich habe gerade das "= null" losgeworden, alles funktioniert gut. Hier ist ein Beispiel für das, was ich geändert habe

public ActionResult Delete(Guid id = null)
{
    //....
}

Dies wurde geändert in

public ActionResult Delete(Guid id)
{
    //....
}

Das Site-Modell ist nichts Besonderes. SiteId, Abkürzung und DisplayName ... versuchen, es für diese Frage so einfach wie möglich zu halten. Ok, also starte ich die Website und gehe zu htpp: //.../TestSites/ und alles funktioniert perfekt.

Ich habe festgestellt, dass alle meine Ansichten (Erstellen, Löschen, Details und Bearbeiten) eine @Model MVCWeb.MyEntities-Site verwenden. aber in der Index.cshtml Ansicht bemerkte ich, dass es ein verwendete

@model IEnumerable<MVCWeb.MyEntities.Site>

Dies funktioniert gut für die generierte Vorlage, aber ich möchte ein „Composite View-Modell“ verwenden. Vielleicht versuche ich hier, mein MVVM-Wissen einzumischen, aber wenn möglich, möchte ich mich daran halten. In meinen Augen ist ein zusammengesetztes Ansichtsmodell nur ein Modell, das für eine Ansicht spezifisch ist, die aus einem oder mehreren Entitätsmodellen zusammen mit zusätzlichen Eigenschaften wie SelectedSiteId usw. besteht.

Also habe ich ein sehr einfaches ViewModel namens TestSitesViewModel erstellt

public class TestSitesViewModel
{
    //Eventually this will be added to a base ViewModel to get rid
    //of the ViewBag dependencies
    [Display(Name = "Web Page Title")]
    public string WebPageTitle;

    public IEnumerable<MVCWeb.MyEntities.Site> Sites;

    //Other Entities, IEnumberables, or properties go here
    //Not important for this example
}

Dann habe ich in meinem Controller eine Aktionsmethode namens IndexWithViewModel hinzugefügt

public ActionResult IndexWithViewModel()
{
    var vm = new TestSitesViewModel();
    vm.WebPageTitle = "Sites With Composite View Model";
    vm.Sites = db.Sites.ToList();

    return View(vm);
}

Ich habe dann eine Kopie der Datei Index.cshtml erstellt und sie IndexWithModel.cshtml genannt, um meinem neuen ActionResult-Methodennamen zu entsprechen. Ich habe die oberste Zeile von geändert

@model IEnumerable<MVCWeb.MyEntities.Site>

Zu

@model MVCWeb.Models.TestSitesViewModel

Ich habe dies vor dem Tabellenabschnitt hinzugefügt, um den DisplayNameFor und den DisplayFor zu testen

@Html.DisplayNameFor(model => model.WebPageTitle)
&nbsp;
@Html.DisplayFor(model => model.WebPageTitle)
<br />

Geändert die

@foreach (var item in Model) {

Zu

@foreach (var item in Model.Sites) {

Und kommentierte den Abschnitt tr aus, der vorerst alle Tabellenüberschriften enthält. Alles funktioniert einwandfrei, außer dass @ Html.DisplayNameFor den Variablennamen "WebPageTitle" anzeigt, anstatt "Web Page Title" zu verwenden, wie im Display-Attribut der Datenanmerkung in angegeben

[Display(Name = "Web Page Title")]
public string WebPageTitle;

Auch wenn ich in dem Abschnitt tr, der die Tabellenkopfzeileninformationen enthält, einen Kommentar hinterlasse. Ich kann für mein ganzes Leben nicht herausfinden, was ich eingeben soll. Ich habe model.Sites.Abbreviation, model.Sites [0] .Abbreviation und verschiedene andere Kombinationen ausprobiert, erhalte jedoch Fehler.

<tr>
    <th>
        @Html.DisplayNameFor(model => model.Abbreviation)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.DisplayName)
    </th>
    <th></th>
</tr>

Also, was soll ich dort verwenden? Ich bin nicht ganz sicher, warum model.Sites.Abbreviation nicht funktioniert, da Sites genau den gleichen Typ haben wie das Modell in der ursprünglichen Datei Index.cshtml

Antworten auf die Frage(2)

Ihre Antwort auf die Frage