2009-03-22 6 views
2

Ich habe Erfahrung mit ASP.NET MVC, aber nur mit einer Webanwendung, bei der sich der Inhalt der Masterseite nicht ändert. Ich habe mich gefragt, wie Sie mit einer Site umgehen, auf der beispielsweise das Menü (das auf der Masterseite steht) aus einer Datenbank geladen wird. Wo würden Sie diese Daten laden?Wie würde dies in ASP.NET MVC getan werden?

In WebForms würden Sie das Menü in den Code-Behind der Masterseite laden, oder das Menü als Benutzersteuerelement haben und das Laden im Code-Behind von diesem tun. Aber wo ist das bei MVC?

Erstellen Sie eine Klasse, die von Controller erbt, die Sie für alle Ihre Controller verwenden und das Menü bei jedem Aktionsaufruf laden lassen (ich weiß nicht, ob das möglich ist, aber wahrscheinlich)?

Oder erstellen Sie eine Hilfsmethode, die Sie in jeder Aktion aufrufen, wo Sie es wollen (weil einige Aktionen nur eine Teilansicht zurückgeben, die das Menü nicht neu lädt), die - obwohl nicht katastrophal - ein wenig ermüdend erscheint .

Oder würden Sie gegen MVC sündigen und laden Sie es einfach in der Master-Seite Code-Behind?

Was ist der beste Ansatz dazu (natürlich nicht auf meine Lösungen beschränkt)?

Antwort

1

ActionFilter s werden verwendet, um eine Anfrage abzufangen und etwas zu verarbeiten. Du könntest sie benutzen.

Ist es eine Sünde gegen das MVC-Muster?

Sie brechen das MVC-Muster in gewissem Maße. Aber der höhere Punkt ist: Bietet es viel mehr Wert, wenn Sie sich zwingen, es nicht zu brechen? Ich glaube nicht, dass Sie dadurch in große Schwierigkeiten geraten, also behalten Sie Einfachheit und Wartbarkeit im Hinterkopf und wählen Sie die Art und Weise, wie Sie es in Ihrer spezifischen Situation tun würden.

0

Ich würde einen Modelltyp erstellen, aus dem die Masterseite ihre Daten bezieht. Leiten Sie dann den Modelltyp der Seite vom MasterModel ab.

Der Controller füllt eine Instanz des PageModels und die Masterseite nimmt es auf.

NB (Alternativ das Modell der Masterseite könnte eine Schnittstelle, die durch die Seiten Modelle. Implementiert sein). In MVC-CTPs erforderte dies einige Zwischenklassen, um die Typübereinstimmung zu überschreiben, um zu Basisklassendaten zu gelangen. Ich weiß nicht, ob dies in RTM behoben wurde.

0

Die ASP.NET MVC Futures-Baugruppe (more info here) enthält eine Erweiterungsmethode, die Sie Seite tun dies in Ihrem Master lässt:

<% Html.RenderAction<NavigationController>(c => c.Show()); %> 

Sie benötigen um auf die Assembly zu verweisen und den Namespace "Microsoft.Web.Mvc" in Ihrer Datei web.config hinzuzufügen, damit dies funktioniert.

Verwandte Themen