Übergeben von Daten an die Masterseite in ASP.NET MVC

Wie können Sie Daten an die Masterseite (mit ASP.NET MVC) übergeben, ohne die MVC-Regeln zu verletzen?

Persönlich bevorzuge ich abstrakte Code (Basis-Controller) oder Basisklasse, die an alle Ansichten übergeben wird.

Wenn Ihre Ansichten stark typisierte Ansichtsdatenklassen haben sollen, könnte dies für Sie funktionieren. Andere Lösungen sind wahrscheinlich korrekter, aber das ist eine schöne Balance zwischen Design und functionalität IMHO.

Die Masterseite enthält eine stark typisierte View-Datenklasse, die nur relevante Informationen enthält:

public class MasterViewData { public ICollection Navigation { get; set; } } 

Jede Ansicht, die diese Masterseite verwendet, verwendet eine stark typisierte Ansichtsdatenklasse, die ihre Informationen enthält und von den Masterseiten-Ansichtsdaten abgeleitet wird:

 public class IndexViewData : MasterViewData { public string Name { get; set; } public float Price { get; set; } } 

Da ich nicht möchte, dass einzelne Controller etwas über das Zusammenstellen der Masterseitendaten wissen, kapsle ich diese Logik in eine Fabrik ein, die an jeden Controller weitergegeben wird:

 public interface IViewDataFactory { T Create() where T : MasterViewData, new() } public class ProductController : Controller { public ProductController(IViewDataFactory viewDataFactory) ... public ActionResult Index() { var viewData = viewDataFactory.Create(); viewData.Name = "My product"; viewData.Price = 9.95; return View("Index", viewData); } } 

Die inheritance stimmt mit dem Master überein, um die Beziehung gut zu sehen, aber wenn es um das Rendern von Partials / Benutzersteuerelementen geht, werde ich ihre Ansichtsdaten in die Seitenansichtsdaten schreiben, z

 public class IndexViewData : MasterViewData { public string Name { get; set; } public float Price { get; set; } public SubViewData SubViewData { get; set; } } < % Html.RenderPartial("Sub", Model.SubViewData); %> 

Dies ist nur ein Beispielcode und soll nicht so wie er ist kompiliert werden. Entwickelt für ASP.Net MVC 1.0.

Ich bevorzuge es, die datengesteuerten Teile der Master-Ansicht in Teiltöne zu zerlegen und sie mit Html.RenderAction zu rendern . Dies hat mehrere Vorteile gegenüber dem populären View-Modell-inheritancesansatz:

  1. Master View-Daten sind vollständig von “normalen” View-Modellen entkoppelt. Dies ist eine Zusammensetzung, die über die inheritance hinausgeht und zu einem lockeren gekoppelten System führt, das einfacher zu ändern ist.
  2. Master-View-Modelle werden durch eine völlig separate Controller-Aktion aufgebaut. “Normale” Aktionen müssen sich darum keine Gedanken machen, und es gibt keine Notwendigkeit für eine Ansichtsdatenfabrik, die für meinen Geschmack übermäßig kompliziert erscheint.
  3. Wenn Sie ein Tool wie AutoMapper verwenden , um Ihre Domäne Ihren Ansichtsmodellen zuzuordnen , ist es einfacher zu konfigurieren, da Ihre Ansichtsmodelle Ihren Domänenmodellen mehr ähneln, wenn sie Master-Ansichtsdaten nicht erben.
  4. Mit separaten Aktionsmethoden für Stammdaten können Sie das Caching der Ausgabe auf bestimmte Bereiche der Seite anwenden. Normalerweise enthalten Master-Ansichten Daten, die sich weniger häufig ändern als der Inhalt der Hauptseite.

BEARBEITEN

Generic Error hat unten eine bessere Antwort geliefert. Bitte lies es!

Ursprüngliche Antwort

Microsoft hat tatsächlich einen Eintrag auf dem “offiziellen” Weg veröffentlicht , um damit umzugehen. Dies bietet einen Schritt-für-Schritt-Durchlauf mit einer Erklärung ihrer Argumentation.

Kurz gesagt, sie empfehlen die Verwendung einer abstrakten Controller-class, aber sehen Sie selbst.

Abstrakte Controller sind eine gute Idee, und ich habe keinen besseren Weg gefunden. Ich bin interessiert zu sehen, was andere Leute auch getan haben.

Ich habe etwas recherchiert und bin auf diese beiden Seiten gestoßen. Vielleicht könnten sie helfen.

ASP.NET MVC Tipp # 31 – Übergeben von Daten an Masterseiten und Benutzersteuerelemente

Übergeben von Daten an Masterseiten mit ASP.NET MVC

Ich finde, dass ein gemeinsames Elternelement für alle Modellobjekte, die Sie an die Ansicht übergeben, außerordentlich nützlich ist.

Es wird sowieso immer einige gemeinsame Modelleigenschaften zwischen den Seiten geben.

Das Request.Params-Objekt ist veränderbar. Es ist ziemlich einfach, skalare Werte als Teil des Anforderungsverarbeitungszyklus hinzuzufügen. Aus Sicht der Ansicht könnte diese Information in QueryString oder FORM POST bereitgestellt worden sein. h

Ich denke, dass ein anderer guter Weg wäre, Interface für die Ansicht mit einer Eigenschaft wie ParentView einer Schnittstelle zu erstellen, so dass Sie sowohl für Steuerelemente, die einen Verweis auf die Seite (übergeordnete Kontrolle) benötigen, als auch für Masteransichten, auf die zugegriffen werden soll Ansichten.

Die anderen Lösungen haben keine Eleganz und brauchen zu lange. Ich entschuldige mich dafür, dass ich diese traurige und verarmte Sache fast ein ganzes Jahr später getan habe:

  

Also habe ich diese statische Methode Get () auf SiteMasterViewData, die SiteMasterViewData zurückgibt.