Exportar (0) Imprimir
Expandir todo

PageStatePersister (Clase)

Proporciona la funcionalidad básica para los mecanismos de persistencia del estado de vista de ASP.NET.

Espacio de nombres: System.Web.UI
Ensamblado: System.Web (en system.web.dll)

public abstract class PageStatePersister
public abstract class PageStatePersister
public abstract class PageStatePersister
No aplicable.

Las solicitudes y respuestas HTTP no tienen ningún estado de forma inherente. Para mantener la información de estado entre las distintas solicitudes HTTP, las páginas de servidor ASP.NET pueden almacenar el estado de Page. Este estado, denominado estado de vista, consta de la configuración de la página y los controles, así como de los datos que hacen que la página y los controles se muestren como si fueran los mismos que el usuario vio y utilizó la última vez que se enviaron y recibieron del servidor. Existen varios mecanismos para almacenar el estado de vista entre distintas solicitudes sucesivas a la misma página. La clase abstracta PageStatePersister representa la clase base para estos mecanismos de almacenamiento de la información de estado.

El mecanismo predeterminado de persistencia del estado de vista en ASP.NET consiste en mantener la información de estado como una cadena codificada en Base64 en un elemento HTML oculto (un elemento con el atributo type establecido en "hidden") de la página. Una página ASP.NET utiliza un objeto HiddenFieldPageStatePersister para realizar este trabajo, utilizando una instancia de IStateFormatter para serializar y deserializar la información de estado del objeto. Otra posibilidad es almacenar el estado de vista de las páginas en el objeto Session, en el servidor, utilizando la clase SessionPageStatePersister para los clientes móviles con un ancho de banda y unos recursos limitados. En algunos casos, se puede deshabilitar completamente la persistencia del estado de vista. En caso de que se deshabilite, puede ocurrir que las páginas y los controles que dependen de la persistencia de estado no se comporten correctamente en algunas ocasiones. Para obtener más información sobre la administración de estado de la página y sobre el estado de vista, vea Administración de estados en ASP.NET.

Cuando se escriben controles, la información de estado de los controles se puede almacenar en el diccionario ViewState, que es un objeto StateBag. Los desarrolladores podrían recuperar el estado de los controles a través de la propiedad ControlState. A la propiedad ViewState se le asignan claves y valores, y el objeto Page serializa la información de estado entre las distintas solicitudes. Para realizar un control de estado personalizado del control, reemplace los métodos LoadViewState y SaveViewState. Toda la información de estado que se guarde en este diccionario se perderá cuando un desarrollador de páginas deshabilite el estado de vista. Para mitigar este riesgo, en la versión 2.0 de ASP.NET, la información de estado crítica se puede almacenar en otro objeto, denominado estado de control. El objeto de estado de control no se ve afectado cuando un desarrollador de páginas deshabilita el estado de vista. El almacenamiento de la información de estado en el objeto control de estado exige que el control reemplace los métodos LoadControlState y SaveControlState, y que el control se registre para almacenar la información de estado en el estado de control cada vez que se inicialice. Para registrar un control de modo que utilice el estado de control, hay que reemplazar el método OnInit y llamar al método RegisterRequiresControlState. Para obtener más información sobre la forma de utilizar la propiedad ViewState y sobre el estado de control a la hora de desarrollar controles, vea Desarrollar controles de servidor ASP.NET personalizados.

Para mantener el estado de vista en clientes que no admiten los mecanismos existentes de persistencia del estado de vista, puede extender la clase PageStatePersister para introducir métodos propios de persistencia del estado de vista; también puede utilizar adaptadores de página para configurar la aplicación ASP.NET de forma que utilice otros mecanismos de persistencia del estado de vista basados en el tipo de cliente al que se proporciona una página. Las clases que se derivan de la clase PageStatePersister deben reemplazar el método abstracto Save para almacenar el estado de vista y el estado de control en el medio de persistencia y deben reemplazar el método Load para extraerlo. Si necesita serializar el estado de vista y el estado de control en una cadena, puede utilizar el objeto IStateFormatter, al que se obtiene acceso a través de la propiedad StateFormatter. Serializa y deserializa con eficacia la información de estado de objeto en una cadena codificada en Base64. También puede reemplazar la propiedad StateFormatter para proporcionar su propio mecanismo de serialización del estado de objeto.

En el siguiente ejemplo de código se muestra cómo crear un objeto PageStatePersister que guarde el estado de vista y el estado de control en el servidor Web. La clase StreamPageStatePersister muestra la forma de reemplazar los métodos Load y Save para extraer y guardar información del estado de vista. Como los mecanismos de persistencia de estado están relacionados con las funciones de representación adaptable y del cliente, se proporciona la clase MyPageAdapter para activar la clase StreamPageStatePersister para una aplicación ASP.NET. Finalmente, se proporciona un archivo de funciones de explorador (.browser) para habilitar el adaptador MyPageAdapter para una clase específica de clientes (en este caso, el explorador Web predeterminado).

namespace Samples.AspNet.CS
{

    using System;
    using System.IO;
    using System.Security.Permissions;
    using System.Web;
    using System.Web.UI;

    //
    // The StreamPageStatePersister is an example view state
    // persistence mechanism that persists view and control
    // state on the Web server.
    //
    [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
    public class StreamPageStatePersister : PageStatePersister
    {

        public StreamPageStatePersister(Page page)
            : base(page)
        {
        }
        //
        // Load ViewState and ControlState.
        //
        public override void Load()
        {
            Stream stateStream = GetSecureStream();

            // Read the state string, using the StateFormatter.
            StreamReader reader = new StreamReader(stateStream);

            IStateFormatter formatter = this.StateFormatter;
            string fileContents = reader.ReadToEnd();

            // Deserilize returns the Pair object that is serialized in
            // the Save method.
            Pair statePair = (Pair)formatter.Deserialize(fileContents);

            ViewState = statePair.First;
            ControlState = statePair.Second;
            reader.Close();
            stateStream.Close();
        }
        //
        // Persist any ViewState and ControlState.
        //
        public override void Save()
        {

            if (ViewState != null || ControlState != null)
            {
                if (Page.Session != null)
                {
                    Stream stateStream = GetSecureStream();

                    StreamWriter writer = new StreamWriter(stateStream);

                    IStateFormatter formatter = this.StateFormatter;
                    Pair statePair = new Pair(ViewState, ControlState);

                    // Serialize the statePair object to a string.
                    string serializedState = formatter.Serialize(statePair);

                    writer.Write(serializedState);
                    writer.Close();
                    stateStream.Close();
                }
                else
                    throw new InvalidOperationException("Session needed for StreamPageStatePersister.");
            }
        }
        // Return a secure Stream for your environment.
        private Stream GetSecureStream()
        {
            // You must provide the implementation to build
            // a secure Stream for your environment.
            return null;
        }
    }
}

En el siguiente ejemplo de código se muestra cómo crear una clase PageAdapter que devuelva una instancia de StreamPageStatePersister, que se utiliza para guardar el estado de vista y el estado de control de una página Web ASP.NET.

namespace Samples.AspNet.CS {

    using System.Security.Permissions;
    using System.Web;
    using System.Web.UI;

    [AspNetHostingPermission(SecurityAction.Demand, Level=AspNetHostingPermissionLevel.Minimal)]
    public class MyPageAdapter : System.Web.UI.Adapters.PageAdapter {

        public override PageStatePersister GetStatePersister() {
            return new Samples.AspNet.CS.StreamPageStatePersister(Page);
        }
    }
}

Compile estas dos clases en un ensamblado que puede utilizar para ejecutar un ejemplo; para ello, utilice la siguiente línea de comandos del compilador. Asegúrese de que el ensamblado compilado se encuentre en el directorio \Bin, situado bajo la raíz de la aplicación ASP.NET.

// C:\>csc /t:library /out:C:\inetpub\wwwroot\bin\Samples.AspNet.CS.dll MyPageAdapter.cs TextFilePageStatePersister.cs
//
// C:\>

Por último, para habilitar el adaptador MyPageAdapter, deberá crear un directorio denominado Exploradores bajo la raíz de la aplicación ASP.NET e incluir un archivo .browser con la información de configuración. El elemento <refid> del archivo de configuración indica que la configuración reemplaza los valores especificados para el explorador predeterminado en el archivo de configuración Default.browser. En este ejemplo, el adaptador MyPageAdapter se utiliza para las páginas Web ASP.NET (donde normalmente no se utiliza ningún adaptador).

<browsers>
    <browser refid="Default" >
        <controlAdapters>
            <adapter 
                controlType="System.Web.UI.Page"                            
                adapterType="Samples.AspNet.CS.MyPageAdapter" />
        </controlAdapters>
    </browser>
</browsers>

Los miembros estáticos públicos (Shared en Visual Basic) de este tipo son seguros para la ejecución de subprocesos. No se garantiza que los miembros de instancias sean seguros para la ejecución de subprocesos.

Windows 98, Windows 2000 Service Pack 4, Windows CE, Windows Millennium, Windows Mobile para Pocket PC, Windows Mobile para Smartphone, Windows Server 2003, Windows XP Media Center, Windows XP Professional x64, Windows XP SP2, Windows XP Starter

Microsoft .NET Framework 3.0 es compatible con Windows Vista, Microsoft Windows XP SP2 y Windows Server 2003 SP1.

.NET Framework

Compatible con: 3.0, 2.0
Mostrar:
© 2014 Microsoft