3 Stimmen

MVC - Übergabe zusätzlicher Informationen an die Ansicht

Ich entwickle eine Website mit Asp.Net MVC Framework. Wir müssen allgemeine Benutzerinformationen über eine Reihe von Seiten hinzufügen, ähnlich wie die Reputationsleiste oben auf Stack Overflow.

Ich halte es für wichtig, dass bei der Erstellung einer Controllermethode kein zusätzlicher Overhead entsteht, um diese zusätzlichen Informationen zur Ansicht hinzuzufügen. Dies schließt die Möglichkeit aus, diese Informationen im ViewData-Objekt zu übergeben oder die ViewModels so zu ändern, dass sie das Reputationsfeld akzeptieren, da dies dazu führen würde, dass jeder Controller so aussehen würde:

public ActionResult Index()
{
    ViewData["reputationScore"] = GetUsersReputation(userId);

    // main controller logic here
}

Wenn dies für 90 % der Seiten einer Website verwendet wird, könnte es ziemlich zeitaufwändig sein, die Seite zu ändern, wenn wir auch die Anzahl der Benutzerabzeichen anzeigen wollen.

Mir fallen 4 Lösungen für dieses Problem ein

Stammseiten verwenden Rufen Sie das Ansehen des Benutzers im Code der Musterseite ab, und setzen Sie die Markierung für das Ansehen in die Musterseitenmarkierung.

Benachteiligungen:

  1. Dies scheint sich von allem zu entfernen, wofür MVC steht.
  2. Ich habe mir überlegt, zu alternativen View-Engines (z.B. Razor) zu wechseln, aber ich bin mir nicht sicher, wie gut sich diese miteinander vertragen werden.
  3. Er schränkt das Layout des Rufs ein - es ist schwierig, ihn in der Mitte der Seite unterzubringen.

Erweitern Sie HtmlHelper um eine GetUsersReputation-Methode Dies scheint eine leichte Verletzung dessen zu sein, wofür das Html-Objekt verwendet werden sollte - es wird nicht nur die Ausgabe gerendert, sondern es wird auf die Datenbank zugegriffen. Ich kann nicht denken, von irgendwelchen anderen wichtigen Fragen mit diesem anderen als die Verletzung der Metapher.

Überschreiben Sie die System.Web.Mvc.ViewPage Überschreibung von Viewpage, um zusätzlich zu Html ein Objekt bereitzustellen, das zum Aufrufen einer Auswahl von Methoden, die auf die Datenbank zugreifen, verwendet werden kann. Stellen Sie sicher, dass Erweiterungsmethoden auf die gleiche Weise wie HtmlHelper hinzugefügt werden können, so dass, wenn neue Methoden benötigt werden, diese entsprechend erweitert werden können. Dies könnte uns erlauben, etwas zu schreiben wie:

<% DataAccess.GetUsersReputation() %>

Erstellen eines generischen Basis-Viewmodells Anstatt Ihr Ansichtsmodell direkt an die Ansicht zu übergeben, verpacken Sie es in ein Basis-Viewmodell, das alle benötigten Methoden enthalten kann:

public ActionResult Index()
{
    MyViewModel viewCoreInfo = model.GetData();

    return View(new BaseViewModel<MyViewModel>(viewCoreInfo));
}

BaseViewModel kann alle Eigenschaften bereitstellen, die Sie für zusätzliche Informationen auf der Webseite benötigen. z.B. UsersReputation (es könnte entweder die Datenbank im Konstruktor abfragen, oder die Daten laden, wenn auf die Eigenschaft zugegriffen wird). Ich denke, dass dies die MVC-Metapher besser beibehält, aber ein wenig umständlich ist.

  1. Hat jemand anderes eine bessere Lösung gefunden?
  2. Welche ist die beste - wenn Sie sie verwendet haben, waren sie wirksam/problematisch?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X