Search code examples
c#asp.net-mvcviewbag

Clear the ViewBag?


Is there any way to clear the ViewBag?

ViewBag has no setter, so it can't simply be nulled out:

ViewBag = null;

I also can't seem to use reflection to iterate over it and wipe out its dynamic properties, as you can't create an instance of a dynamic.

Note: I know ViewBag on its own is a bit of a code smell as it's not strongly typed, and is basically a giant collection of global variables. And we're moving away from it, but still need to deal with it in the meantime.


Solution

  • You can just call

    ViewData.Clear();
    

    As ViewBag uses it internally.

    Here is working example - https://dotnetfiddle.net/GmxctI . If you uncomment commented line, then displayed text will be cleared

    Here is current implementation for ViewBag in MVC:

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

    And part of that 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;
    }
    

    So as you can see it depends on ViewData object