2009-08-11 10 views
0

Wir beginnen mit dem Wechsel von Web Forms zu MVC für alle neuen Anwendungen. Ich arbeite daran, unsere Masterseite zu portieren und versuche, die Anforderungen zu erfüllen, dass wir eine einzige Masterseite für alle Anwendungen benötigen. Die primäre Navigation für die Anwendung muss sich in einem Menü auf der Masterseite befinden. Dies zu erreichen war einfach, der schwierige Teil ist, dass jede Anwendung bestimmen muss, was im Menü angezeigt werden soll, indem ein eindeutiges Regelwerk verwendet wird. Einige Apps können einfach sagen, hier ist die Menüstruktur über etwas wie eine SiteMap zu verwenden. Andere müssen bestimmen, was im Menü angezeigt wird, basierend auf den Rollen, die der Benutzer hat, dies kann auch leicht mit einer SiteMap gehandhabt werden. Die Situation, mit der ich Probleme habe, ist, dass einige Apps die Menüs basierend auf den Rollen des Benutzers erstellen müssen, aber auch auf den Daten, an denen sie arbeiten. h. Derselbe Benutzer kann im Menü für eine Seite eine andere Option haben, wenn er an einem Objekt 'foo' arbeitet, als wenn er an einem Objekt 'bar' arbeitet.Bereitstellen von Daten im Menü in meiner ASP.NET MVC-Masterseite

Was ich an dieser Stelle getan habe, ist, dass ich einen HtmlHelper erstellt habe, der von der Masterseitenansicht aufgerufen wird und eine Liste von Objekten eines benutzerdefinierten Typs annimmt und eine ungeordnete Liste zurückgibt, die von einem jQuery-Plugin formatiert wird um das Menü anzuzeigen. Die Liste der Objekte, die die Hilfsmethode verwendet, wird mit dem Dictionary ViewData an die Ansicht übergeben. Derzeit wird der Wert dieses ViewData-Knotens im Konstruktor jedes Controllers festgelegt. Dadurch kann für jede Seite und möglicherweise für jede Methode ein anderes Menü festgelegt werden, ohne dass der Wert für jede Aktionsmethode festgelegt werden muss, es sei denn, sie ist erforderlich. Ich habe auch eine Klasse erstellt, die eine SiteMap analysiert und die Liste der Elemente zurückgibt, die zum Erstellen des Menüs erforderlich sind. Mit dieser Klasse setze ich den ViewData-Wert im Controller ein. Wenn eine Anwendung mehr Kontrolle darüber benötigt, wie die Menüdaten generiert wurden, könnten sie ihre eigene Klasse erstellen, um die Daten zu generieren, solange sie eine Liste des richtigen Objekttyps zurückgibt.

Diese Lösung scheint bisher gut zu funktionieren, sie fühlt sich aus irgendeinem Grund nicht richtig an. Ich hoffe, dass ich entweder ein paar Ideen für einen besseren Weg oder eine Bestätigung dafür bekommen kann, dass dies ein gültiger Ansatz zur Lösung dieses Problems ist.

Antwort

1

Wenn es etwas ist, das auf jeder Seite sein wird, etwas tun, wie folgt aus:

erstellen Basis-Controller:

public class MyBaseController : Controller 

Lassen Sie sich diese Controller die Daten bekommen sie braucht und dass die Daten in der schicken ViewData ["menu"] zur Ansicht. Dann haben alle Ihre Controller erben von dieser:

public class HomeController : MyBaseController 

In der Master-Seite, Schleife durch Ihre Viewdata und Ihr Menü erstellen.

(ich habe so etwas für meine Untermenü, das eine Liste der Kategorien angezeigt.)

+0

nur kommentieren wollte, dass dies wahrscheinlich so gut ist eine Lösung, wie ich weiß, da das Szenario, dass jede Seite/Aktion Möglicherweise müssen Sie das Menü bearbeiten. (Ansonsten finde ich Html.RenderAction etwas sinnvoller, aber nur wenn das Menü etwas statischer definiert ist - wie eine Benutzerrolle - und ändert sich nicht pro Seite) –

+0

Ich dachte über die Erstellung eines Basis-Controllers nach, aber seit dem ist es möglich dass jede Seite/Aktion eine andere Menüquelle benötigt, die so aussieht, als würde sie nicht so gut funktionieren. – Hamman359

+0

Wenn jede Seite/Aktion ein neues Menü vorgibt, dann erstellen Sie einen Basis-Controller mit einer Methode, die den Controller und die Aktion übernimmt und dann die ViewData ausspuckt. – Martin

0

In dem Buch, das ich lese (Pro ASP.NET MVC Framework von Apress) verwenden sie Html.RenderAction für das Menü in der Masterseite. Ich bin Asp.net MVC Neuling, also kann vielleicht jemand anderes mehr Infos dazu geben.

Sie können den Quellcode bei apress.com herunterladen, aber vielleicht könnte das helfen.

Verwandte Themen