Razor code programmgesteuert ausblenden global-Menü posten?
Ich bin ein erfahrener .NET Programmierer, aber ich bin neu auf dieses ganze web-Programmierung Ding. Meine ASP.NET MVC-website verfügt über ein globales layout, enthält einige Inhalte (Menü links oben auf der Seite), die ich ausblenden möchten, unter Bedingungen, die erkannt werden dynamisch vom controller code.
Meine Neigung-die einfache Methode, die verwendet die Werkzeuge, die ich gelernt habe über so weit -- ist, Sie zu schieben ein Boolean HideGlobal Wert in der ViewBag, und setzen den globalen markup in _Layout.cshtml, die ich ausblenden möchten, die in einer @if (ViewBag.HideGlobal) {} - block.
Ich möchte nur wissen, ob dies der "richtige" Weg, es zu tun, oder gibt es einige Rasierer Magie, die ich mit sollte, aus Gründen, die noch nicht ersichtlich für mich?
- Je nachdem, wie Sie bestimmen, zu zeigen, oder verstecken Sie die Artikel, die Sie möglicherweise festlegen möchten ViewData Objekt in einem action-filter (ausserhalb des Controllers).
- Wenn Sie schieben Sie eine HideGlobal im Blick Tasche, die Sie tun müssen, so in jeder einzelnen Aktion.
- das stimmt nicht, ein
ActionFilter
bedeutet, dass Sie es tun können, weltweit - Ich bezog mich auf Bob ' s Ansatz.
- richtig, in diesem Fall ja
- Nein, ich brauche nicht, es zu tun, in jeder Handlung. Ich kann schreiben: @wenn (ViewBag.HideMenu == null || !ViewBag.HideMenu) { <nav>...</nav> }
- aber Sie müssen
ViewBag.HideMenu
bei jeder Aktion, wenn du gehst, es zu tun in einer Handlung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mag ich nicht mit dem view-Modell der Handlung, die außerhalb der view zurückgegeben von der Aktion. Mit base-view-Modell für dieses Szenario fühlt sich sehr klobig.
Ich glaube, es ist sauberer und mehr offensichtlich, benutzen Sie einfach ein separates (Kinder -) Aktion, die die Logik enthält, die für die Angabe, wie das global-Menü angezeigt werden soll. Durch diese Aktion wird das Globale Menü Ansicht. Rufen Sie die Aktion aus Ihrer layout-Seite.
Oder Sie können eine Aktion erstellen, die für den gesamten Kopf, wo das Menü im Zustand " bestimmt-oder ein if/else mit der Darstellung einer Teilansicht des global-Menü.
Beispiel unten kapselt die Bedürfnisse des headers/global-Menü und bietet eine zukunftssichere Möglichkeit, wenn Sie Ihre header/Menü mit minimalen Auswirkungen auf Ihren code-Infrastruktur (Basis-Modell).
~/Controller/LayoutController.cs
~/Views/Layout/Header.cshtml
~/Views/Shared/_Layout.cshtml
Was du beschrieben hast (ein bool in der ViewBag) wird gut funktionieren. Aber persönlich, ich mag die stark typisierte Modell Erfahrung, also wenn ich will ein UI-Logik wie das, was du beschreibst in der master - /layout-Seite (die ist so ziemlich immer), ziehe ich die flags in eine Basis-Modell, dass meine anderen Modelle beerben.
Und an der Spitze der _Layout.cshtml-Seite, die ich angeben, dass ich erwarte einen BaseModel:
Andere Ansichten können, erfordern natürlich andere Modelle, aber wenn Sie dieses layout, Modell-Arten abgeleitet wird, sollte von BaseModel.
Schließlich, wenn ich will, um zu überprüfen, die fahne, anstatt eine geheimnisvolle, undokumentierte Feld in der ViewBag, ich habe die schöne intellisense und Wohlfühl-stark-typisierte Mitglied des Modells:
Edit: ich sollte wohl hinzufügen, dass es oft schön, auch einen Basis-controller, dessen Aufgabe es ist, füllen Sie die Felder in BaseModel. Mine in der Regel wie folgt Aussehen:
Erste Antwort hier, sanft sein 🙂
Diese Art der Sache ist in der Regel auf der Grundlage von Benutzer-Berechtigungen, die würde viel besser in ein Action-Filter anstelle der Basis-controller.
Ja, Sie müssten die
ViewData
oderViewBag
aber es ist wirklich nicht Teil der Ansicht/Modell es ist höher in Ihrer _layout.cshtmlAction Filter
Anzeigen (_layout.cshtml)
Dies gibt Ihnen den Vorteil der Trennung von dieser Logik aus dem controller und weil es ist global, das ist wichtig.
Auch ich habe
ViewData
in meinem Beispiel aber mitViewBag
ist genauso gut.