Я понял суть проблемы. Используя Reflector, мы можем видеть важную часть (и) низкоуровневого метода, который обрабатывает фактическую обратную передачу и затем вызывает событие:
string str = HttpUtility.HtmlDecode(eventArgument);
...
MenuItem item = this.Items.FindItem(str.Split(new char[] { '\\' }), 0);
if (item != null)
this.OnMenuItemClick(new MenuEventArgs(item));
Как вы можете видеть, MenuEventArgs передается MenuItem. Если вы не можете найти его в текущей коллекции Предметов, соответствующей входящим данным поста, событие не возникает. Если ViewState отключен, в меню нет элементов (они были бы перестроены с использованием ViewState). Таким образом, событие не будет возбуждено.
Чтобы обойти это, я сказал, чтобы меню создавалось во время загрузки с использованием еще не обновленных данных (в этот момент оно будет таким же, как в конце последнего запроса). По сути, это то же самое, что перестроить меню из ViewState, так что я не чувствую себя плохо в отношении производительности или чего-то еще. OnMenuItemClick тогда запускается как ожидалось. Наконец, во время PreRender я повторяю, что меню нужно перестроить, чтобы оно отражало изменения, произошедшие в течение части жизненного цикла обратной обработки.
Я потратил много времени на это, так что, надеюсь, эта информация может помочь кому-то еще в подобной ситуации.