Sono con te, Exitos: evito usando ViewBag
troppo. A parte il nome sciocco, non mi piace la digitazione debole che ne deriva. C'è una soluzione, ma è un po 'coinvolta, quindi abbi pazienza con me.
Innanzitutto, creare una classe per memorizzare i "suggerimenti di visualizzazione" che devono essere passati al layout. Io chiamo questo modo creativo di classe "DisplayHints":
public class DisplayHints {
// anything that you want passed from a view to the layout goes here
public bool ShowBanner { get; set; }
}
Poi, creare una classe derivante dalla WebViewPage<T>
che sarà la nuova classe di base dei vostri punti di vista. Si noti come abbiamo una proprietà chiamata DisplayHints
che è memorizzato in ViewData
(che è disponibile per il controller, la vista, e il layout):
public abstract class MyViewPage<T> : WebViewPage<T> {
public DisplayHints DisplayHints {
get {
if(!ViewData.ContainsKey("DisplayHints"))
ViewData["DisplayHints"] = new DisplayHints();
return (DisplayHints)ViewData["DisplayHints"];
}
}
}
Come un commentatore ha sottolineato di seguito, ViewData
è debolmente tipizzato, proprio come ViewBag
. Tuttavia, non c'è modo di sapere per evitare di memorizzare qualcosa in ViewData
/ViewBag
; questo riduce al minimo il numero di variabili debolmente tipizzate a una. Dopo averlo fatto, è possibile memorizzare tutte le informazioni fortemente tipizzate in DisplayHints
come si desidera.
Ora che si dispone di una classe di base per le vostre opinioni, in Web.config
, abbiamo bisogno di dire a MVC di utilizzare la classe di base personalizzato:
<pages pageBaseType="MyNamespace.Views.MyViewPage">
Suona come un sacco di problemi, ma si guadagna qualche grave funzionalità per tutto questo lavoro. Ora a suo avviso, è possibile impostare qualsiasi suggerimento di visualizzazione che si desidera nel modo seguente:
@{ DisplayHints.ShowBanner = true; }
E nel layout, è possibile accedervi con la stessa facilità:
@if(DisplayHints.ShowBanner) {
<div>My banner....</div>
}
Spero che questo aiuta!
Interessante, ma ViewData ha ancora gli stessi deboli problemi di digitazione di ViewBag e si è trattato di molti più problemi per arrivarci. – Maess
Mi piace questa soluzione .. e non penso che sia un "problema in più" estendere la 'WebViewPage' – MilkyWayJoe
Maess, sì,' ViewData' ha gli stessi deboli problemi di digitazione di 'ViewBag'. Tuttavia, invece di salvare una serie di suggerimenti per la visualizzazione come variabili debolmente tipizzate, si salva solo un oggetto, in cui è possibile inserire tutte le cose fortemente tipizzate che si desidera, comprese le strutture più complicate. Nella mia applicazione, la classe 'DisplayHints' contiene oltre venti membri ... tutti fortemente digitati. –