Clear the ViewBag?

Jerad Rose picture Jerad Rose · Mar 16, 2015 · Viewed 11.5k times · Source

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.

Answer

Sergey Litvinov picture Sergey Litvinov · Mar 16, 2015

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