2016-12-06 2 views
1

Dies kann eine dumme Frage sein und ist eher eine Frage darüber, wie etwas zu tun, anstatt eine tatsächliche Codierung Problem.MVC PartialView in mehreren Ansichten mit verschiedenen Modellen

Ich möchte eine Teilansicht haben, die ein Suchformular und Suchergebnisse enthält und das Modell Suppliers verwendet.

Diese Teilansicht würde dann in mehreren Ansichten gerendert werden, die verschiedene Modelle verwenden.

Ist es mir möglich dies oder muss ich das Suchformular innerhalb jeder Ansicht erstellen oder eine Teilansicht für jede Ansicht erstellen, so dass die Ansicht und Teilansicht das gleiche Modell verwenden?

Wenn ich das Suppliers Modell für die Teilansicht und ein anderes Modell für die Ansicht verwenden, bekomme ich nur Fehler:

The model item passed into the dictionary is of type 'x', but this dictionary requires a model item of type 'y'.

+0

Jede Ansicht wird aus dem Inneren der Teilansicht aufrufen, so dass jede Ansicht benötigen Zugriff irgendwie mit dem 'Modell-Lieferanten. Sie können versuchen, eine abstrakte Basisklasse mit einer 'Suppliers'-Liste zu haben und Ihre View-Modelle daraus zu erben, oder sie dazu bringen, eine Schnittstelle zu implementieren, die eine' Suppliers'-Liste enthält. Ich ging mit der zweiten Option, wenn ich ein Filtermodell in mehreren Ansichten brauchte. – Andrew

Antwort

1

Sie können auf jeden Fall tun, dass mit unterschiedlichen Implementierungen.

Erste Option:

Sie können das Modell aus der „Shared“ Ansicht löschen, die Sie haben und haben es mit einem ViewBag oder Bildschirmtextsystem arbeiten, die Sie von Ihrem Controller zur Ansicht übergeben. Offensichtlich müssen Sie diesen View Bag auffüllen oder Daten in allen Controller-Aktionen anzeigen, die diese freigegebene Teilansicht zurückgeben.

Zweite Optionen:

Statt Lieferanten als View-Modell der gemeinsamen Ansicht, die Sie eine andere Eigenschaft in der View-Modell „Supplier“ haben können, die Sie verwenden können, aber wenn Sie machen das gemeinsame anzuzeigen, müssen Sie die Eigenschaft an, und es als das Modell auf die gemeinsame Sicht passieren wie:

Html.RenderPartial("MySharedView", Model.SharedViewModel); 

Jetzt müssen Sie für alle anderen Ansichten, die die gleiche Sache tun, die dieses gemeinsame machen und im Grunde haben diese „SharedViewModel“ als eine Eigenschaft in diesen Ansicht Modellen und übergeben Sie die Model.SharedViewModel zur geteilten Ansicht.

Sicher gibt es auch andere Optionen, die Sie herausfinden können, sobald Sie sich mit Shared Views in MVC vertrauter fühlen.

+0

RenderPartial war die Antwort, also konnte ich das Modell angeben, obwohl ich folgendes tun musste: '@ {Html.RenderPartial (" PathToSharedView ", neues SharedViewModel());}' – JBoom

0

So wird jede Teilansicht direkt an ein Modell gebunden. Wenn Sie verschiedene Informationen aus verschiedenen Modellen in derselben Ansicht haben möchten, wäre Ihre beste Wette das Konzept eines Modals. In Bezug auf Such- und Suchergebnis werden partielle Ansichten zusammen in derselben Ansicht dargestellt. Stellen Sie sicher, dass Sie berücksichtigen, wo Sie sagen, wie Sie das Modell verwenden (zB @model [model name here] oder @model IEnumberable<[model name here]>) Wenn Sie Ihre Ergebnisse auflisten, wie zum Beispiel eine Liste von Suchergebnissen aus einer Datenbank anzeigen möchten, versuchen Sie es mit einem separaten Viewmodel Dies ermöglicht Ihnen, die Art der Interaktion mit bestimmten Tabellen/Spalten individuell zu ändern (dh, wenn Sie durch sie nummerieren)

0

Zuerst müssen Sie Teilansicht unter freigegebenen Ordner mit dem Namen _SearchBox.schtml erstellen.Es kann so etwas wie dieses:

@model IEnumerable<your.project.Supplies> 
<div id="search-box"> 
@using (Html.BeginForm("MakeSearch", "SearchController", FormMethod.Get)) 
    { 
    <input type="search" name="search" /> 
    <input type="submit" value="GO" /> 
} 
</div> 

Dann können Sie es aus jeder Ansicht aufrufen, indem

@{Html.RenderPartial("_SearchBox", listOfSupplies);} 

Andernfalls rufen Sie Aktion im Controller erstellen, wenn Wunsch liefert von der DB zu bekommen und Sie nicht haben Sie eine Liste von Zubehör in Ihrer Elternansicht.

[ChildActionOnlyAttribute] 
     public ActionResult _SearchBox() 
     {   
      var supplies= _service.GetSupplies(); 
      PartialView(supplies);    
     } 

und es aus Sicht nennen:

@{ Html.RenderAction("_SearchBox", "Search"); } 
Verwandte Themen