Очистить ViewBag?

есть ли способ очистить ViewBag?

ViewBag не имеет сеттера, поэтому его нельзя просто обнулить:

ViewBag = null;

Я также не могу показаться, чтобы использовать отражение перебирать его и уничтожать его динамические свойства, так как вы не можете создать экземпляр dynamic.

примечание: Я знаю ViewBag сам по себе является немного запахом кода, поскольку он не сильно типизирован и в основном представляет собой гигантскую коллекцию глобальных переменных. И мы движемся подальше от этого, но все равно нужно разобраться с этим в то же время.

1 ответов


вы можете просто позвонить

ViewData.Clear();

как ViewBag использует его внутренне.

вот рабочий пример -https://dotnetfiddle.net/GmxctI . Если вы раскомментируете строку комментария, то отображаемый текст будет очищен

здесь текущая реализация для ViewBag в MVC:

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

и 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;
}

так как вы можете видеть, это зависит от ViewData объект