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!
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
Ich mag diese Lösung .. und ich denke nicht, es ist ein "viel mehr Ärger", die 'WebViewPage' zu erweitern. – MilkyWayJoe
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. –