Pergunta

Estou tentando definir uma variável ViewState quando um botão é pressionado, mas só funciona na segunda vez que clico no botão.Aqui está o código por trás:

protected void Page_Load(object sender, EventArgs e)
{
    if (Page.IsPostBack)
    {
        lblInfo.InnerText = String.Format("Hello {0} at {1}!", YourName, DateTime.Now.ToLongTimeString());
    }
}

private string YourName
{
    get { return (string)ViewState["YourName"]; }
    set { ViewState["YourName"] = value; }
}


protected void btnSubmit_Click(object sender, EventArgs e)
{
    YourName = txtName.Text;

}

Há algo que estou perdendo?Aqui está a parte do arquivo de design, muito básica, assim como um POC:

<form id="form1" runat="server">
<div>
Enter your name: <asp:TextBox runat="server" ID="txtName"></asp:TextBox>
<asp:Button runat="server" ID="btnSubmit" Text="OK" onclick="btnSubmit_Click" />
<hr />
<label id="lblInfo" runat="server"></label>
</div>
</form>

PS: A amostra é muito simplificada, "use txtName.Text em vez de ViewState" não é a resposta correta, preciso que as informações estejam em ViewState.

Foi útil?

Solução

Page_Load incêndios antes btnSubmit_Click.

Se você quiser fazer algo depois que seus eventos de postback forem acionados, use Page_PreRender.

//this will work because YourName has now been set by the click event
protected void Page_PreRender(object sender, EventArgs e)
{
    if (Page.IsPostBack)
        lblInfo.InnerText = String.Format("Hello {0} at {1}!", YourName, DateTime.Now.ToLongTimeString());
}

A ordem básica é:

  • O início da página é acionado (o init não pode acessar o ViewState)
  • ViewState é lido
  • O carregamento da página é disparado
  • Qualquer evento dispara
  • Incêndios de pré-renderização
  • Renderizações de página
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top