2015-03-16 12 views
10

C'è un modo per cancellare il ViewBag?Cancella il ViewBag?

ViewBag non ha setter, quindi non può essere semplicemente annullato out:

ViewBag = null; 

anche io non riesco a use reflection a scorrere su di esso e spazzare via le sue proprietà dinamiche, come non si può creare un'istanza di dynamic.

Nota: so che il codice ViewBag è un odore di codice in quanto non è fortemente digitato, ed è fondamentalmente una gigantesca raccolta di variabili globali. E ci stiamo allontanando da esso, ma abbiamo ancora bisogno di affrontarlo nel frattempo.

risposta

12

si può chiamare

ViewData.Clear(); 

Come ViewBag usa internamente.

Questo è l'esempio operativo - https://dotnetfiddle.net/GmxctI. Se decommentare la linea commentato, quindi visualizzato il testo verrà cancellata

Ecco current implementation per ViewBag in MVC:

public dynamic ViewBag 
{ 
    get 
    { 
     if (_dynamicViewDataDictionary == null) 
     { 
      _dynamicViewDataDictionary = new DynamicViewDataDictionary(() => ViewData); 
     } 
     return _dynamicViewDataDictionary; 
    } 
} 

E parte di questo DynamicViewDataDictionary

// Implementing this function improves the debugging experience as it provides the debugger with the list of all 
// the properties currently defined on the object 
public override IEnumerable<string> GetDynamicMemberNames() 
{ 
    return ViewData.Keys; 
} 

public override bool TryGetMember(GetMemberBinder binder, out object result) 
{ 
    result = ViewData[binder.Name]; 
    // since ViewDataDictionary always returns a result even if the key does not exist, always return true 
    return true; 
} 

public override bool TrySetMember(SetMemberBinder binder, object value) 
{ 
    ViewData[binder.Name] = value; 
    // you can always set a key in the dictionary so return true 
    return true; 
} 

Quindi, come si può vedere dipende dall'oggetto ViewData

+0

Questo ha funzionato, grazie! Ti verrà assegnato il tuo diritto guadagnato ✓ non appena SO me lo concede. –

+0

Sono contento che abbia aiutato :) –