2012-12-07 11 views
21

Ich muss eine Ansicht erstellen, die die Informationen zum Auftragskopf anzeigt, und ich muss eine Profilansicht hinzufügen, die ein Raster mit Einzelposten anzeigt. Die Teilansicht wird stark von einem Viewmodel typisiert. Ich verstehe, dass ich den HTML-Helper @ Html.Partial ("Pfad/Ansicht") verwenden sollte. Ich habe bis jetzt nur Controller verwendet, um eine Ansicht zu öffnen und das Viewmodel zu füllen, bevor ich es an die View sendete. Da die Teilansicht vom HTML-Helper aufgerufen wird, würde ich gerne wissen, was der beste Weg wäre, die Parital-Ansicht mit den Modelldaten zu füllen.So füllen Sie die partielle Ansicht von mvc razor

Antwort

40

Option 1:. Vererben von Elternseite

Standardmäßig wird jede Teilansicht, die durch Aufrufen von gerendert wird, das Ansichtsmodell an die übergeordnete Ansicht übergeben.

Also, wenn Sie haben:

Ansicht Modell

namespace MyNamesapce 
{ 
    public OrderInfoViewModel 
    { 
     public string OrderTitle { get; set; } 
     public IEnumerable<OrderItem> OrderItems { get; set; } 
    } 
} 

OrderInfo.cshtml

@model MyNamespace.OrderInfoViewModel 

<h1>@Model.OrderTitle</h1> 

@Html.Partial("OrderLineItems") 

Die OrderLineItems Seite sollte ein MyNamespace.OrderViewModel an sie übergeben bekommen ... so Ihre Teilansicht sollte wie folgt aussehen:

OrderLineItems.cshtml

@model MyNamespace.OrderInfoViewModel 

foreach (var orderItem in Model.OrderItems) 
{ 
    //Do stuff 
} 

Option 2: Geben Sie Modell

können Sie den zweiten Parameter verwenden, um die Ansicht Modell angeben weitergegeben werden. I.e.

OrderInfo.cshtml

@model MyNamespace.OrderInfoViewModel 

<h1>@Model.OrderTitle</h1> 

@Html.Partial("OrderLineItems", Model.OrderItems) 

OrderLineItems.cshtml

@model IEnumerable<OrderItem> 

foreach (var orderItem in Model) 
{ 
    //Do stuff 
} 

Option 3: Verwenden Teilaktionen

Wenn Sie eine Teilansicht über mehrere wiederzuverwenden müssen Seiten könnte es gut sein Idee, eine Teilansicht zu verwenden, um zu vermeiden, dass verschiedene Ansichtsmodelle mit den gleichen Informationen gefüllt werden müssen, nur weil die Seite dasselbe Teil verwendet.

z.

Ansicht Modell

namespace MyNamesapce 
{ 
    public OrderInfoViewModel 
    { 
     public string OrderTitle { get; set; } 
    } 
} 

-Controller

public class OrderController : Controller 
{ 
    public ActionResult OrderInfo(int orderId) 
    { 
     OrderInfoViewModel viewModel = GetViewModel(orderId); 
     return View(viewModel); 
    } 

    public PartialViewResult OrderLineItems(int orderId) 
    { 
     IEnumerable<OrderItem> orderItems = GetOrderItems(orderId); 
     return Partial(orderItems); 
    } 
} 

OrderInfo.cshtml

@model MyNamespace.OrderInfoViewModel 

<h1>@Model.OrderTitle</h1> 

@Html.Action("OrderLineItems") 

OrderLineItems.cshtml

@model IEnumerable<OrderItem> 

foreach (var orderItem in Model.OrderItems) 
{ 
    //Do stuff 
} 
+0

Was ist das Szenario, in dem die Option 3 würde mehr als 2 bevorzugt werden? Könnte ich nicht einfach die Teilansicht aufrufen und trotzdem TROCKEN sein? – NickSuperb

+0

Mit den Optionen 1 und 2 müssen Sie das Modell der Hauptseitenansicht mit allen Daten füllen, die für die Teilansicht benötigt werden. Das Szenario in dieser Frage/Antwort ist nicht das beste. Nehmen wir an, Sie hatten ein Einkaufswagen-Übersichts-Widget, das auf zahlreichen Seiten angezeigt wird ... Es wäre einfacher, Option 3 zu verwenden. Andernfalls wäre jede einzelne Aktion, die auch das Warenkorb-Widget (die meisten Seiten) anzeigt, dafür verantwortlich, das Ansichtsmodell mit den Daten zu füllen, die das Warenkorb-Widget benötigt. – Charlino

+0

Richtig merke ich jetzt, dass Sie das Modell indirekt und nicht direkt in die Teilansicht trichterlos leiten müssten. – NickSuperb

4

Mit einer Teilansicht senden Sie ein Modell einfach so ein, wie Sie es mit einer normalen Ansicht tun würden. Zum Beispiel würden, wenn Ihr Modell namens eine Eigenschaft LineItem Objekte ‚Lineitem‘ Sie einfach tun:

@Html.Partial("_PartialName", Model.LineItems) 

Nun, wenn Ihr Modell nicht, dass die Eigenschaft hat, können Sie entweder fügen Sie es, oder ihm eine andere Art und Weise passieren wie ViewBag (ich bevorzuge eine stark typisierte Methode, aber das ist meine opnion:

@Html.Partial("_PartialName", (List<LineItem>)ViewBag.LineItems) 

Dies sind nicht die einzigen Möglichkeiten, aber sie sind meine bevorzugten Methoden