Pergunta

Eu tenho um (derivado) Menu controle, que exibe uma lista bastante grande de itens de uma fonte de dados personalizado. Eu preciso desativar ViewState no menu para evitar o muito chato "Não é possível selecionar um item de menu desativado ou unselectable" quando algum outro controle faz com que a seleção atual para a mudança em uma postagem.

Infelizmente, quando ViewState está desabilitada para o Menu, os postbacks gerado por no menu são não levantar quaisquer eventos. Se eu permitir ViewState, o evento OnMenuItemClick é levantada. Se eu desativar ViewState, OnMenuItemClick não é levantada. Estou perplexo.

Eu preciso deixar ViewState off para o menu, assim como eu posso lidar com postagens no menu real?

Neste momento eu estou inclinado a usar o evento Carregar do Menu, analisar o __EVENTTARGET para ver se é o Menu, e ir de lá. Este seria tecnicamente processar o evento de postagem antes que ele faria normalmente, mas isso é ok, eu acho.

Qualquer idéias melhores?

Foi útil?

Solução 2

Eu descobri a essência do problema. Com refletor podemos ver a parte mais importante (s) do método de baixo nível que manipula o postback real e, em seguida, dispara o evento:

string str = HttpUtility.HtmlDecode(eventArgument);
...
MenuItem item = this.Items.FindItem(str.Split(new char[] { '\\' }), 0);
if (item != null)
    this.OnMenuItemClick(new MenuEventArgs(item));

Como você pode ver as MenuEventArgs é entregue um MenuItem. Se a pessoa não pode ser encontrado na coleção Items atuais que coincide com os dados pós entrada, em seguida, o evento não é gerado. Com ViewState desativada, o menu não tem nenhum item (eles teriam sido reconstruído usando ViewState). Assim, o evento não será gerado.

Para contornar isso, eu disse ao menu para construir-se durante o carregamento usando os dados ainda não-atualizados (neste ponto será a mesma que era no final do último pedido). Este é essencialmente o mesmo que reconstruir o menu de ViewState, então eu não me sinto mal em relação ao desempenho, ou o que quer. OnMenuItemClick é então demitido como esperado. Por último, durante PreRender Digo Menu para reconstruir mais uma vez, para que ele reflete as mudanças que aconteceram durante a porção de processamento de postagem do ciclo de vida.

Eu perdi muito tempo sobre isso, por isso espero que esta informação pode ajudar alguém em uma situação similar.

Outras dicas

Sim, você pode escolher, tanto para uso viewstate para repovoar um controlo dependente ou você pode vincular-lo antes que os eventos são disparados (Page_Load é bom).

Eu não necessariamente sempre vinculá-lo novamente em Page_PreRender porém, se nada mudou neste postback (mudanças aconteceu em outro lugar na página), então não há razão para ligá-la novamente.

Em vez disso você pode ser capaz de se ligar somente em determinados eventos quando você sabe que vai ter que mudar.

Em Page_Load religar o controle para a sitemapdata e verifique se IsPostBack.

if (IsPostBack) {
            Menu.DataBind();
}

este trabalho para mim e para reduzir o viewstate.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top