Como faço para persistir o valor de uma marca através de um response.redirect?
-
01-07-2019 - |
Pergunta
Eis a situação: Eu tenho conjunto de texto de um rótulo, imediatamente seguido por uma chamada response.redirect () da seguinte forma (isto é apenas um exemplo, mas eu acredito que descreve a minha situação com precisão):
aspx:
<asp:Label runat="server" Text="default text" />
Código-behind (código chamado em um evento onclick):
Label.Text = "foo";
Response.Redirect("Default.aspx");
Quando a página é processada, o rótulo diz "texto padrão". O que eu preciso fazer diferente? Meu entendimento era que tais mudanças seriam feitas automaticamente nos bastidores, mas, aparentemente, não neste caso. Obrigado.
Para um pouco de fundo extra, o código-behind trecho é chamado dentro de um método que é invocado sobre um evento onclick. Há mais do que isso, mas eu incluído apenas o que é de interesse para esta questão.
Solução
Depois de um redirecionamento você vai perder qualquer informação de estado associada a seus controles. Se você simplesmente deseja que a página para atualizar, remover o redirecionamento. Depois que o código terminar a execução, a página será atualizada e qualquer estado será mantido.
Nos bastidores, isso funciona porque ASP.NET escreve as informações de estado de um campo de entrada oculto na página. Quando você clica em um botão, o formulário é publicado e ASP.NET decifra o viewstate. Seu código é executado, modificando o estado, e depois de que o estado é novamente escrito para o campo oculto eo ciclo continua, até que você alterar a página sem um POST . Isso pode acontecer quando clicar em um link para outra página, ou através Response.Redirect (), que instrui o navegador a seguir o url especificado.
Outras dicas
Uma chamada Response.Redirect
pedirá navegador do usuário para carregar a página especificada no URL que você dá. Porque este é um novo pedido para a sua página na página utiliza o texto que está contido na sua marcação (como eu assumir que o texto do rótulo está sendo definido dentro de um manipulador de botão ou similar).
Se você remover a chamada Response.Redirect
sua página deve funcionar como anunciado.
ASP e ASP.Net são inerentemente apátridas menos que estado é explicitamente especificado. Normalmente entre postbacks informações como o valor de uma etiqueta está contida no viewstate, mas se você mudar as páginas que viewstate é perdido porque é estava sendo armazenado em um campo oculto na página.
Se você quiser manter o valor da etiqueta entre as chamadas que você precisa usar um dos mecanismos estatais (por exemplo Session, Preferences) ou sistemas de comunicação (Request (GET, POST)).
Além disso, você pode estar à procura de Server.Transfer que irá mudar quem está processando a página nos bastidores. Response.Redirect é projetado para abandonar o seu contexto atual na maioria dos casos.
Para persistir o estado, usar Server.Transfer em vez de Response.Redirect.
Então, se me permite responder a minha própria pergunta (de acordo com o FAQ, que é incentivado), a resposta curta é, você não persistir o estado de exibição por meio de redirecionamentos. Ver estado é para postagens, não redireciona.
Bonus: Tudo que você sempre quis saber sobre o estado de exibição no ASP .NET , com fotos!
Por que vale a pena (e esperamos que ele vale alguma coisa), capítulo 6 do Pro ASP NET 3.5 em C # 2008, segunda edição é um recurso fantástico sobre o assunto. Todo o livro tem sido muito bem até agora.