2016-06-29 11 views
-1

Ich muss eine Ansicht der Rechnung erstellen. Ich habe viele Modelle (Tabellen) und ich möchte alle Daten von mehreren Modellen in einer Ansicht der Rechnung anzeigen. Ich habe eine leere (ohne Modell) Ansicht erstellt und in eine Teilansicht eingefügt. Einer von Teilansicht einer Ansicht mit einem Modell zurück, aber diese Lösung zurückkehrt mir Ausnahme ... Das ist meine Arbeit: Das ist meine Aktion in der Steuerung:Mehrere Modelle in einer einzigen Ansicht anzeigen

public ActionResult Customer() 
     { 
      var data = db.Customer; 

      return PartialView("Index", data); 
     } 

     public ActionResult Invoice() 
     { 
      var data = db.Invoice; 

      return PartialView("Index", data); 
     } 

     public ActionResult Dealer() 
     { 
      var data = db.Dealer; 

      return PartialView("Index", data); 
     } 

     public ActionResult Paid() 
     { 
      var data = dane.Paid; 

      return PartialView("Index", data); 
     } 

     public ActionResult Products() 
     { 
      var data = dane.Products; 

      return PartialView("Index", data); 
     } 

Dies ist einer der Teilansicht:

@model IEnumerable<Invoice_v1._0.Models.Products> 

<table class="table"> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.Name) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Price) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Amount) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Name) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Price) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Amount) 
     </td> 
    </tr> 
} 

</table> 

Dies ist meine "Index" Ansicht mit Teilansichten:

@Html.Partial("_Customer") 
@Html.Partial("_Invoice") 
@Html.Partial("_Dealer") 
@Html.Partial("_Paid") 
@Html.Partial("_Products") 

Wie kann ich sie lösen?

+1

Was/wo ist die Ausnahme? –

+0

Verwenden Sie '@ Html.Action()', wenn Sie eine Controller-Methode aufrufen möchten, die eine Teilansicht mit Daten zurückgibt. (oder verwenden Sie ein Ansichtsmodell, das alle aufgefüllten Daten enthält) –

+0

Ich bemerke auch, dass es nicht notwendig ist, Teilansichten zu verwenden, nur weil Sie verschiedene "Tabellen" in Ihrer Ansicht haben. Die idiomatische Methode besteht darin, ein ViewModel zu erstellen, das _all_ die für die Ansicht erforderlichen Daten enthält und dieses als "Modell" für Ihre Ansicht verwendet. Teilansichten sind mehr für _reusable_ views, die in verschiedene Parent-Views gelangen können. –

Antwort

2

Wenn Sie darauf bestehen, eine einheitliche Sicht auf hat, dann können Sie Wiedergabe von Teilansichten davon abhängig machen:

if (Model != null && Model is Customer) 
    Html.Partial("_Customer", Model as Customer) 

, und so weiter.

Da alle Modelle exklusiv sind (Sie haben nie mehr als ein Objekt), sehe ich keinen Sinn darin, eine Indexansicht zu haben. Sie haben bereits eine (Teil-) Ansicht pro Klasse, warum also nicht einfach als normale Ansichten verwenden?

aktualisieren

Wenn Sie von jedem der Aktionsmethoden separate Ansicht zurückkehren wollen, dann können Sie das tun, indem Sie den Namen jeder Ansicht angeben. Siehe diese Frage für Details: How to return ActionResult with specific View (not the controller name)

In Ihrem speziellen Fall, das würde bedeuten:

public ActionResult Customer() 
{ 
    return View("_Customer", db.Customer); 
} 

public ActionResult Invoice() 
{ 
    return View("_Invoice", db.Invoice); 
} 

public ActionResult Dealer() 
{ 
    return View("_Dealer", db.Dealer); 
} 

public ActionResult Paid() 
{ 
    return View("_Paid", db.Paid); 
} 

public ActionResult Products() 
{ 
    return View("_Products", db.Products); 
} 

Stellen Sie sicher, dass jede der Ansichten, die eine stark typisierte Modell erwartet. Das macht es einfach, die Ansichten zu implementieren.

+0

Sie meinen, ich sollte eine regelmäßige Ansichten statt Teilansichten erstellen? Aber wie kann ich dies in einer Ansicht anzeigen (eine Seite)? – kenzolek

+0

Ich habe ein Update zur Antwort hinzugefügt. –

+0

Ich verwende Ihre Lösung, aber es gibt mir "NullReferenceExcetion" in Model in foreach Schleife in _Products Teilansicht. Hast du eine Idee warum? – kenzolek

0

Während Ihr Ansatz funktioniert, haben Sie weniger oder keine Kontrolle über die Daten (wenn Sie annehmen wollen, dass Sie sich den übergeordneten Daten anschließen oder diese verwenden). In solchen Situationen erzeuge ich ein ViewModel mit mehr als einem Objekt. Zum Beispiel

So jetzt kann ich dieses View Model bevölkern, bevor ich in meine Sicht geht.

Jetzt kann ich meine Ansicht entweder mit Teilansichten oder einer ganzen Ansicht für meine Rechnungsdaten entwerfen.

Ich werde als Modell setzen die IEnumerable oder IList

wenn ich teilweise Verwendung für beide wird es sein @model db.Objects.InvoiceHead // für den Header

@model IEnumerable // für die Details

0

in hTML-Code wird wie sein, dass

@Html.Partial("~/Views/Customers/_AttachFileList.cshtml") 

Ihren eigenen Ordnerpfad verwenden.Hoffnung funktioniert

Verwandte Themen