none
Viewstate RRS feed

  • Pergunta

  • Pessoal,

    Como funciona o viewstate em relacao ao postback ?!?

    Isso pq parece que qdo ocorre o postback, ele perde seus valores em minha aplicacao.
    Ele nao deveria ser mantido ?

    Neto

    segunda-feira, 13 de fevereiro de 2012 03:22

Todas as Respostas

  • Olá A.G.A,

    Deveria funcionar corretamente.

    Vc esta utilizando Ajax? Verifique se no Page Load de sua página não existe um código que altere os dados...

    Vc esta preenchendo os campos com JavaScript?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    segunda-feira, 13 de fevereiro de 2012 10:38
    Moderador
  • Isso não deveria acontecer, que tipo de valores e quais controles ele está perdendo o valor ? Já verificou se inadivertidamente você não desligou o ViewStateMode da sua página ou dos controles ?

    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Twitter @Olavooneto
    Se for útil marque como resposta e faça um Developer feliz :)

    segunda-feira, 13 de fevereiro de 2012 10:59
    Moderador
  • Você verificou nos seus controles da página, se as propriedade ViewStateMode está habilitada?

    <asp:TextBox ViewStateMode="Enabled" />

    segunda-feira, 13 de fevereiro de 2012 15:19
  • Eu disse errado.

    O Viewstate nao é mantido quando entra aqui:

    if (!IsPostBack)
    

    E como faco entao pra manter o valor se nao é um postback ?

    Valeu

    terça-feira, 14 de fevereiro de 2012 04:59
  • Olá A.G.A,

    Se vc estiver executando uma ação dentro de um UpdatePanel e salvando os dados em um ViewState, seus dados não serão persistidos, pois o Ajax não irá commitar os dados no código de sua página.

    Poderia postar o código por inteiro?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    terça-feira, 14 de fevereiro de 2012 11:40
    Moderador
  • Ai estao os arquivos.
    Realmente nao entendo pq o Viewstate nao esta sendo mantido.

    Na 1a execucao eu tenho um session que vem de outra pagina (keywordsOriginal).
    Entao passo o valor dele pra um viewstate e libero a session do servidor.

    Assim eu manteria todo o estado desta pagina atraves do viewstate.
    Mas ele nao esta mantendo o estado.

    ARQUIVO ASPX

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="testeViewstate.aspx.cs" Inherits="WEB.testeViewstate" %>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
                <table width="100%">
                    <tr>
                        <td align="left" colspan="2"><asp:Label ID="lblOriginal" runat="server" Text=""></asp:Label></td>
                    </tr>
                </table>
            
            <br />
        
            <asp:ListView ID="lv" runat="server" ItemPlaceholderID="itemPlaceHolder" 
                    ondatabound="lv_DataBound" 
                    onpagepropertieschanging="lv_PagePropertiesChanging1">
                        
                <LayoutTemplate>
                    <asp:PlaceHolder runat="server" ID="itemPlaceholder"></asp:PlaceHolder>
                </LayoutTemplate>
                        
                <ItemTemplate>
                    <strong><asp:Label ID="lblTitulo" runat="server" Text=""></asp:Label><%# Eval("Titulo"%></strong>
                    <br />
                </ItemTemplate>
            </asp:ListView>
            
                <asp:DataPager ID="dataPagerL" runat="server" PagedControlID="lv" QueryStringField="p">
                    <Fields>
                        <asp:NextPreviousPagerField ButtonType="Button"  ShowFirstPageButton="true" FirstPageText="Primeira" ShowNextPageButton="false"  ShowPreviousPageButton="false" />
                        <asp:NumericPagerField ButtonType="Button" ButtonCount="15" NextPageText="..." PreviousPageText="..." />
                        <asp:NextPreviousPagerField ButtonType="Button"  ShowLastPageButton="true" LastPageText="Última" ShowPreviousPageButton="False" ShowNextPageButton="false" />
                    </Fields>
                </asp:DataPager>
        </form>
    </body>
    </html>


    ARQUIVO CS

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Text;
    using ClassLibrary;
    using FRAMEWORK;
     
    namespace WEB
    {
        public partial class testeViewstate : System.Web.UI.Page
        {
            string keywords;
     
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    keywords = Request.QueryString["k"];
                    ViewState["keywords"] = keywords;
     
                    if (Session["keywordsOriginal"] != null)
                    {
                        ViewState["keywordsOriginal"] = Session["keywordsOriginal"].ToString();
                        Session.Remove("keywordsOriginal");
                    }
                    PesquisarLinks(0, keywords);
                }
            }
     
            private void PesquisarLinks(int paginaAtual, string keywordsComposta)
            {
                ObjectDataSource ds = new ObjectDataSource();
                ds.EnablePaging = true;
     
                ds.StartRowIndexParameterName = "pCorrente";
                ds.MaximumRowsParameterName = "ppPagina";
                ds.TypeName = "FRAMEWORK.Link";
                ds.SelectCountMethod = "RetornoRegistros";
                ds.SelectMethod = "SelectLinks";
                ds.SelectParameters.Add("ppPaginaCorrente", paginaAtual.ToString());
                ds.SelectParameters.Add("pPalavraChave", keywordsComposta);
     
                lv.DataSource = ds;
                lv.DataBind();
            }
     
            protected void lv_DataBound(object sender, EventArgs e)
            {
                lblOriginal.Text = ViewState["keywordsOriginal"].ToString();
            }
     
            protected void lv_PagePropertiesChanging1(object sender, PagePropertiesChangingEventArgs e)
            {
                string a = ViewState["keywordsOriginal"].ToString();
                int pageindex = e.StartRowIndex / e.MaximumRows;
                dataPagerL.SetPageProperties(pageindex * dataPagerL.PageSize, dataPagerL.MaximumRows, false);
     
                PesquisarLinks(pageindex, ViewState["keywords"].ToString());
            }
        }
    }

    Valeu

    quarta-feira, 15 de fevereiro de 2012 06:34
  • Olá A.G.A,

    Tudo beleza?

    Reparei que no exemplo que vc postou o UpdatePanel não esta lá. Seria isso mesmo? Chegou a testar o funcionamento da página sem o UpdatePanel?

    Verifiquei seu código e me parece que deverá funcionar mesmo com o UpdatePanel, pois o único método que grava dados no ViewState esta no PageLoad da página.

    Outra solução pode ser essa:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Text;
    using ClassLibrary;
    using FRAMEWORK;
     
    namespace WEB
    {
        public partial class testeViewstate : System.Web.UI.Page
        {
            string keywords;
     
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    keywords = Request.QueryString["k"];
                    lblOriginal.Text = keywords;
     
                    if (Session["keywordsOriginal"] != null)
                    {
                        Session.Remove("keywordsOriginal");
                    }
                    PesquisarLinks(0, keywords);
                }
            }
     
            private void PesquisarLinks(int paginaAtual, string keywordsComposta)
            {
                ObjectDataSource ds = new ObjectDataSource();
                ds.EnablePaging = true;
     
                ds.StartRowIndexParameterName = "pCorrente";
                ds.MaximumRowsParameterName = "ppPagina";
                ds.TypeName = "FRAMEWORK.Link";
                ds.SelectCountMethod = "RetornoRegistros";
                ds.SelectMethod = "SelectLinks";
                ds.SelectParameters.Add("ppPaginaCorrente", paginaAtual.ToString());
                ds.SelectParameters.Add("pPalavraChave", keywordsComposta);
     
                lv.DataSource = ds;
                lv.DataBind();
            }
     
            protected void lv_DataBound(object sender, EventArgs e)
            {
    
            }
     
            protected void lv_PagePropertiesChanging1(object sender, PagePropertiesChangingEventArgs e)
            {
                string a = lblOriginal.Text;
                int pageindex = e.StartRowIndex / e.MaximumRows;
                dataPagerL.SetPageProperties(pageindex * dataPagerL.PageSize, dataPagerL.MaximumRows, false);
     
                PesquisarLinks(pageindex, lblOriginal.Text);
            }
        }
    }

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    quarta-feira, 15 de fevereiro de 2012 10:50
    Moderador
  • É, eu removi o update pq vi que nao era ele q estava influenciando.
    A ideia é trazer a session, passar o valor dela pra uma viewstate e apagar a session do servidor.

    Assim utilizo o valor da viewstate pra trabalhar na pagina.
    Mas cada vez que a pagina é atualizada, eu perco o valor do viewstate.

    Mas conseguiu achar o problema ?

    quarta-feira, 15 de fevereiro de 2012 18:05