2012-04-10 10 views
11

Ich habe eine Ansicht und möchte eine Layoutseite verwenden. Auf der Layout-Seite möchte ich ein bedingtes Banner haben, das einige der Ansichten ein- und ausschalten. Ich frage mich, wie ich das machen kann?Wie kann ich eine Variable auf einer _Layout-Seite festlegen?

Ich habe dies in der _Layout.cshtml Seite ...

@if (ShowBanner){ 

    <h1>banner</h1> 

} 

Ich frage mich, wie ich das Ein/Aus meiner MVC-Ansicht Seite drehen kann? Oder ob das überhaupt richtig ist? Ich meine, wenn ich diese Variable auf der View-Seite deklariere, weiß der Master das nicht. Wie kommunizieren die beiden über C#? Benutze ich den Viewbag? Lieber nicht.

Ich weiß, mit Formen dreht sich alles um die Seite oder Master-Mitglied verweist, kann einfach nicht scheinen ziemlich es mit MVC zu sehen ...

Jede Hilfe sehr geschätzt ...

Dank Pete

Antwort

12

ich bei dir bin, Exitos: Ich vermeide ViewBag zu verwenden. Abgesehen von dem dummen Namen mag ich die schwache Typisierung nicht, die damit einhergeht. Es gibt eine Lösung, aber es ist irgendwie involviert, also ertragen Sie mit mir.

Erstellen Sie zuerst eine Klasse zum Speichern der "Anzeigehinweise", die an das Layout übergeben werden sollen. Ich nenne kreativ diese Klasse „DisplayHints“:

public class DisplayHints { 
    // anything that you want passed from a view to the layout goes here 
    public bool ShowBanner { get; set; } 
} 

Dann eine Klasse ZUSAMMENHANG WebViewPage<T> erstellen, die die neue Basisklasse Ihrer Ansichten sein. Beachten Sie, wie wir eine Eigenschaft namens DisplayHints haben, die in ViewData gespeichert ist (die mit der Steuerung zur Verfügung steht, der Ansicht, und das Layout):

public abstract class MyViewPage<T> : WebViewPage<T> { 
    public DisplayHints DisplayHints { 
    get { 
     if(!ViewData.ContainsKey("DisplayHints")) 
     ViewData["DisplayHints"] = new DisplayHints(); 
     return (DisplayHints)ViewData["DisplayHints"]; 
    } 
    } 
} 

Als Kommentator unten wies darauf hin, ViewData ist schwach typisiert, so wie ViewBag. Es gibt jedoch keine Möglichkeit, dass ich die Speicherung von etwas in ViewData/ViewBag vermeiden kann; Dies minimiert nur die Anzahl der schwach typisierten Variablen auf eins. Sobald Sie dies getan haben, können Sie so viele stark typisierte Informationen in DisplayHints speichern, wie Sie möchten.

Nun, da Sie eine Basisklasse für Ihre Ansichten haben, in Web.config, müssen wir MVC sagen, Ihre benutzerdefinierten Basisklasse zu verwenden:

<pages pageBaseType="MyNamespace.Views.MyViewPage"> 

Es klingt wie eine Menge Ärger, aber Sie einige ernsthafte gewinnen Funktionalität für all diese Arbeit. Jetzt in Ihrer Ansicht nach können Sie einen beliebigen Anzeige Hinweis eingestellt Sie wie folgt vor:

@{ DisplayHints.ShowBanner = true; } 

Und in Ihrem Layout, können Sie es zugreifen genauso einfach:

@if(DisplayHints.ShowBanner) { 
    <div>My banner....</div> 
} 

Ich hoffe, das hilft!

+0

Interessant, aber ViewData hat immer noch die gleichen schwachen Tippfehler wie ViewBag, und Sie haben viel mehr Mühe bekommen, um dorthin zu gelangen. – Maess

+0

Ich mag diese Lösung .. und ich denke nicht, es ist ein "viel mehr Ärger", die 'WebViewPage' zu ​​erweitern. – MilkyWayJoe

+0

Maess, ja,' ViewData' hat die gleichen schwachen Tippfehler wie 'ViewBag'. Anstatt jedoch eine Reihe von Anzeigehinweisen als schwach typisierte Variablen zu speichern, speichern Sie nur ein Objekt, in das Sie beliebig viele stark typisierte Elemente einfügen können, einschließlich komplizierterer Strukturen. In meiner Anwendung enthält diese 'DisplayHints' Klasse mehr als zwanzig Mitglieder ... alle stark typisiert. –

3

Ein Modell für Ihr Layout zu haben ist keine gute Idee, da es alle Ansichten zwingt, dieses Modell zu verwenden. Sie können diese Art von Informationen jedoch in den ViewBag einfügen und den Wert im Konstruktor einer Ihrer Controller-Datenbanken angeben.

+1

Sie könnten sogar einen Basis-Controller haben, der die Variable immer in den ViewBag legt – Joe

+0

Natürlich war ich nicht sicher, ob das OP immer die gleiche Controller-Basis verwenden würde. – Maess

+0

Wenn Sie die Variable in den Viewbag legen können, warum können Sie sie nicht stark in den Controller selbst eingeben? – liang

-1

versuchen, etwas wie folgt aus:

auf dem Controller

var yourVariable; 
// other stuff and eventually fill the 'yourVariable' variable 
ViewBag.YourVariable = yourVariable; 

dann auf Ihrer Ansicht

@if (ViewBag.YourVariable){ 

    <!-- Your markup --> 

} 
Verwandte Themen