it-swarm-eu.dev

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

Wie übergeben Sie Daten an Master Page (mit ASP.NET MVC), ohne die MVC-Regeln zu verletzen?

Persönlich ziehe ich es vor, abstrakte Controller (Basis-Controller) oder Basisklassen zu codieren, die an alle Ansichten übergeben werden.

102
Łukasz Sowa

Wenn Sie möchten, dass Ihre Ansichten stark typisierte Ansichtsdatenklassen haben, funktioniert dies möglicherweise für Sie. Andere Lösungen sind wahrscheinlich mehr richtig aber dies ist meiner Meinung nach eine gute Balance zwischen Design und Praktikabilität.

Die Masterseite enthält eine stark typisierte Ansichtsdatenklasse, die nur relevante Informationen enthält:

public class MasterViewData
{
    public ICollection<string> Navigation { get; set; }
}

Jede Ansicht, die diese Masterseite verwendet, verwendet eine stark typisierte Ansichtsdatenklasse, die ihre Informationen enthält und aus den Ansichtsdaten der Masterseiten 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 Stammseitendaten wissen, fasse ich diese Logik in einer Factory zusammen, die an jeden Controller übergeben wird:

public interface IViewDataFactory
{
    T Create<T>()
        where T : MasterViewData, new()
}

public class ProductController : Controller
{
    public ProductController(IViewDataFactory viewDataFactory)
    ...

    public ActionResult Index()
    {
        var viewData = viewDataFactory.Create<ProductViewData>();

        viewData.Name = "My product";
        viewData.Price = 9.95;

        return View("Index", viewData);
    }
}

Die Vererbung stimmt mit dem Master überein, um die Beziehung gut anzuzeigen, aber wenn es um das Rendern von Teilbereichen/Benutzersteuerelementen geht, werde ich deren Anzeigedaten in die Seitenanzeigedaten zusammensetzen, 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 Beispielcode und nicht für die Kompilierung im vorliegenden Zustand vorgesehen. Entwickelt für ASP.Net MVC 1.0.

77
Generic Error

Ich bevorzuge es, die datengesteuerten Teile der Master-Ansicht in Teilbereiche aufzuteilen und sie mit Html.RenderAction zu rendern. Dies hat verschiedene Vorteile gegenüber dem gängigen Vererbungsansatz für Ansichtsmodelle:

  1. Die Stammdaten der Ansicht sind vollständig von "normalen" Ansichtsmodellen entkoppelt. Dies ist Komposition über Vererbung und führt zu einem locker gekoppelten System, das einfacher zu ändern ist.
  2. Master-View-Modelle werden durch eine vollständig separate Controller-Aktion erstellt. "Regelmäßige" Aktionen brauchen sich darüber keine Gedanken zu machen, und es ist keine View Data Factory erforderlich, die für meinen Geschmack übermäßig kompliziert zu sein scheint.
  3. Wenn Sie zufällig ein Tool wie AutoMapper verwenden, um Ihre Domäne Ihren Ansichtsmodellen zuzuordnen, ist die Konfiguration einfacher, da Ihre Ansichtsmodelle Ihren Domänenmodellen ähnlicher sind, wenn sie nicht erben Master-View-Daten.
  4. Mit separaten Aktionsmethoden für Stammdaten können Sie Ausgabecaches einfach auf bestimmte Bereiche der Seite anwenden. In der Regel enthalten Master-Ansichten Daten, die sich weniger häufig ändern als der Inhalt der Hauptseite.
59
Todd Menier

[~ # ~] edit [~ # ~]

Allgemeiner Fehler hat unten eine bessere Antwort geliefert. Bitte lies es!

Ursprüngliche Antwort

Microsoft hat tatsächlich einen Eintrag auf der "offizielle" Weg gepostet, um damit umzugehen. Dies bietet eine schrittweise Anleitung mit einer Erläuterung ihrer Argumentation.

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

20
Michael La Voie

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

7
Ian P

Ich habe einige Nachforschungen angestellt und bin auf diese beiden Websites gestoßen. Vielleicht könnten sie helfen.

ASP.NET MVC Tipp Nr. 31 - Übergeben von Daten an Masterseiten und Benutzersteuerelemente

Übergeben von Daten an Masterseiten mit ASP.NET MVC

3
David Negron

Ich finde, dass ein gemeinsames übergeordnetes Element 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.

2
Matt Mitchell

Ich denke, dass eine andere gute Möglichkeit darin besteht, ein Interface für die Ansicht mit einer Eigenschaft wie ParentView einer Schnittstelle zu erstellen, sodass Sie es sowohl für Steuerelemente verwenden können, die einen Verweis auf die Seite benötigen (übergeordnetes Steuerelement), als auch für Master-Ansichten, auf die zugegriffen werden soll Ansichten.

0
dimarzionist

Den anderen Lösungen fehlt es an Eleganz und sie dauern zu lange. Ich entschuldige mich dafür, dass ich fast ein ganzes Jahr später diese sehr traurige und verarmte Sache gemacht habe:

<script runat="server" type="text/C#">
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        MasterModel = SiteMasterViewData.Get(this.Context);
    }

    protected SiteMasterViewData MasterModel;
</script>

Ich habe also eindeutig diese statische Methode Get () für SiteMasterViewData, die SiteMasterViewData zurückgibt.

0
rasx

Das Request.Params-Objekt kann geändert werden. Es ist ziemlich einfach, skalare Werte als Teil des Anforderungsverarbeitungszyklus hinzuzufügen. Aus Sicht der Ansicht könnten diese Informationen im QueryString oder im FORM POST enthalten sein. hth

0
mtutty