2017-03-13 4 views
0

Ich erbte eine MVC-Site und wurde gebeten, zwei Seiten zu einer zu kombinieren. Da beide Ansichten ihr eigenes Ansichtsmodell haben, dachte ich, anstatt die beiden VMs zusammen zu schieben, könnte ich eine Teilansicht verwenden, um in diesem Fall die Uhrgruppe in einer Ansicht namens Uhr_Detail anzuzeigen. Allerdings muss ich die GroupId die Daten für die Uhr Gruppe füllen.Verwirrt, wenn Parameter an MVC Partial View übergeben werden?

So selten Teilansichten verwendet habe, bin ich verwirrt, wie dies funktioniert. Ich habe eine neue Ansicht mit dem Namen _ClockGroup.cshtml erstellt und einfach etwas Basiscode von der anderen Seite kopiert und eingefügt, nur um zu sehen, ob ich etwas anzeigen kann.

In meinem ClockDetail-Controller habe ich Folgendes hinzugefügt.

public PartialViewResult ClockGroup(int groupId) 
{ 
    ClockGroupViewModel vm = DAL.GetClockGroupDetail(groupId); 
    return PartialView(vm); 
} 

Hier ist _ClockGroup.cshtml

@model site.Models.ViewModels.ClockGroupViewModel 

<div class="form-group"> 
    @Html.LabelFor(m => m.GroupId, htmlAttributes: new { @class = "control-label col-md-2" }) 
    @Html.EditorFor(m => m.GroupId, new { htmlAttributes = new { @class = "form-control", disabled = "disabled", @readonly = "readonly" } }) 
</div> 
<div class="form-group"> 
    @Html.LabelFor(m => m.GroupName, htmlAttributes: new { @class = "control-label col-md-2" }) 
    @Html.EditorFor(m => m.GroupName, new { htmlAttributes = new { @class = "form-control", autofocus = "autofocus" } }) 
    @Html.ValidationMessageFor(m => m.GroupName, "", new { @class = "text-danger" }) 
</div> 

Das von der clock_detail.cshtml Ansicht ist. Es verwendet das folgende Modell und dann fügte ich die Teilweise zu dieser Ansicht hinzu.

@model site.Models.ViewModels.ClockDetailViewModel 

@Html.Partial("_ClockGroup") 

Natürlich bekomme ich einen Fehler, dass das Modell eine Wörterbuchtyp “site.Models.ViewModels.ClockDetailViewModel” vergangen, aber das Wörterbuch erfordert ein Modell Artikel Zeit “site.Models.ViewModels.ClockGroupViewModel".

Muss ich die beiden ViewModels zusammen kombinieren und nur das einzelne ViewModel verwenden?

+0

Nebenbei schreiben Sie Code in Ihren Teilsprachen, sollten Sie wahrscheinlich mit [Vorlagen statt] (http://www.growingwiththeweb.com/2012/12/aspnet-mvc-display-and-editor- templates.html). Vorlagen sind vorteilhaft, weil sie viel besser lesen und die Konvention für das Aufrufen erleichtert die Diagnose. Es ist selten für mich, Teiltöne zu verwenden. –

+0

Ich schaue mir Templates an. Ich bin immer offen für etwas, wenn es die Wartbarkeit des Codes hilft. – Caverman

Antwort

1

Wenn Sie nicht über ein Objekt als zweiten Parameter angeben:

@Html.Partial("_ClockGroup") 

Es geht automatisch das aktuelle Modell, das vom Typ ClockDetailViewModel

Ihr Teils erfordert ClockGroupViewModel

Das Update geben würde Seien Sie, wenn Sie das Teil aufrufen, um in ClockGroupViewModel Eigenschaft Ihres ClockDetailViewModel Objekts zu übergeben:

@Html.Partial("_ClockGroup", Model.ClockGroupViewModelProperty) 

Wenn Ihre Klasse ClockDetailViewModel keine ClockGroupViewModel-Eigenschaft besitzt, müssen Sie diese zu Ihrem ViewModel hinzufügen und die Daten auffüllen.

+0

Ich habe gelesen, wo nicht passieren ein Modell würde das aktuelle Modell übergeben und dachte, das ist ein Teil des Problems. Allerdings konnte ich nicht herausfinden, wie ich das ClockGroupViewModel an das Partial übergebe. Mein ClockDetailViewModel hat keine ClockGroupViewModel-Eigenschaft. Ich denke, ich muss schauen, was ich tun muss, um das zu schaffen. Danke ... – Caverman

+0

Ich habe das Gefühl, dass es bei Datenbank-Trips doppelt eintaucht, aber zumindest sieht es so aus, als würde das funktionieren, ohne einen Haufen Code neu schreiben zu müssen. – Caverman

+0

... Ich dachte, wir reden hier über Ansichtsmodelle? Ansichtsmodelle sind nur Container mit Daten, von denen eine Ansicht abhängig ist. Ihre Ansichtsmodelle sollten selten 1: 1-Darstellungen Ihrer Datenbankmodelle sein. – maccettura

Verwandte Themen