Es necesario mantener información de estado de las páginas Web y sus controles. Sin embargo, dado que las aplicaciones web se crean sobre el protocolo HTTP, que es un protocolo sin estado, mantener la información de estado se vuelve muy difícil. Para resolver este problema, la tecnología ASP.NET 2.0 proporciona una variedad de soluciones, como el uso de sesión, cookies, estado de vista, estado de control, campos ocultos, cadenas de consulta, configuración de usuario personalizada (perfil), etc. Para utilizar la tecnología ASP.NET 2.0 para crear controles de servidor, mantener la información de estado también es muy importante. La solución principal es utilizar el estado de vista y el estado de control. Este artículo explica en detalle los conocimientos básicos del estado de vista (ViewState) e introduce el método de aplicación del estado de vista a través de aplicaciones típicas.
Ver descripción general del estado
Ver estado es una tecnología muy importante que permite que la página y los controles de la página mantengan información de estado durante el viaje de ida y vuelta desde el servidor al cliente y de regreso desde el cliente. De esta manera, se puede crear un efecto de página con estado y de ejecución continua sobre un entorno sin estado como la Web. Esta sección presenta principalmente el mecanismo operativo, los métodos de aplicación, los tipos de datos almacenados, el rendimiento y la seguridad, el bloqueo del estado de vista (esta es una nueva característica de ASP.NET 2.0), las ventajas y desventajas del estado de vista.
(1)
El proceso de ejecución específico del estado de vista del mecanismo de ejecución es: cada vez que el usuario solicita una página .aspx, el marco .NET primero serializa los datos de estado de los controles relacionados en una cadena y luego los convierte en un archivo llamado __VIEWSTATE El valor del campo oculto se envía al cliente. Si la página se solicita por primera vez, el control del servidor también se ejecutará por primera vez. El campo oculto llamado __VIEWSTATE solo contiene la información predeterminada del control, que generalmente está vacía o nula. En el evento de devolución de datos posterior, el estado de propiedad del control del servidor disponible en la devolución de datos anterior se guarda en ViewState. Esto permite que el control del servidor monitoree el estado antes de que ocurra el evento de devolución de datos actualmente manejado. Estos procesos están a cargo del marco .NET y, para los usuarios, la ejecución de la página .aspx tendrá el efecto de una ejecución continua.
(2) Tipos de datos almacenados
El estado de la vista puede almacenar múltiples tipos de datos y, para mejorar la eficiencia operativa, el estado de la vista en sí también incluye un conjunto de métodos de serialización optimizados para tipos comunes. Los tipos de datos admitidos por el método de serialización del estado de vista de forma predeterminada incluyen los siguientes: String, Int32, Unit, Color, Array, ArrayList, HashTable y el convertidor de tipos personalizado TypeConverter.
El estado de vista se ha optimizado para los objetos Array, ArrayList y HashTable que contienen los tipos enumerados anteriormente. Por lo tanto, cuando utilice el estado de vista en los controles, debe intentar limitar su uso a los tipos de datos simples anteriores, así como a los tipos optimizados. Aquí, debemos centrarnos en el convertidor de tipos personalizado TypeConverter, que proporciona un método unificado para convertir el tipo de valor a otros tipos y acceder a valores y subpropiedades estándar. Por ejemplo, puede utilizar TypeConverter para convertir una cadena en un valor numérico o un valor numérico en una cadena. Si no hay un convertidor de tipos, el marco de la página utilizará la función de serialización binaria proporcionada por el marco .NET para serializar el objeto.
(3) Rendimiento y seguridad
Cuando se utiliza el estado de vista, los objetos deben serializarse primero y luego deserializarse mediante devolución de datos. Entonces, tenemos que saber algo sobre el rendimiento de ViewState. De forma predeterminada, ViewState del control estará habilitado. Si no necesita utilizar ViewState, es mejor desactivarlo. ViewState ya no será necesario en las siguientes situaciones: (1) El control no define eventos del lado del servidor (los eventos de control en este momento son todos eventos del lado del cliente y no participan en la devolución de datos); sin valores de propiedad dinámicos o vinculados a datos. La forma de desactivar el estado de vista es establecer el valor EnableViewState del control en "falso", es decir, EnableViewState="false".
De forma predeterminada, cuando el contenido relacionado con el estado de la vista se compila y se envía al cliente, el lector verá el contenido del campo oculto __VIEWSTATE en el código HTML de la página. Estas son algunas cadenas sin sentido y son el resultado de que el marco .NET codifique el contenido relevante mediante codificación Base64. Se envían de un lado a otro entre el cliente y el servidor en texto claro. En algunos casos, como cuando se trata de contenido confidencial como contraseñas, cuentas, cadenas de conexión, etc., es muy inseguro utilizar el método predeterminado. Con este fin, .NET Framework proporciona dos mecanismos de seguridad para ViewState:
Mecanismo de verificación:
puede indicarle a .NET Framework que agregue un código hash a los datos de ViewState configurando el atributo EnableViewStateMAC="true" (el código hash es una A). tipo SHA1 con una longitud de 160 bits, por lo que afectará seriamente el rendimiento de la ejecución). Cuando se produce un evento de devolución de datos, el código hash se restablecerá y debe coincidir con el código hash original. De esta manera, se puede verificar de manera efectiva si ViewState puede ser manipulado durante el proceso de transmisión. De forma predeterminada, .NET Framework utiliza el algoritmo SHA1 para generar códigos hash ViewState. Además, también puede seleccionar el algoritmo MD5 configurando
· El mecanismo de cifrado
utiliza cifrado para proteger los valores de datos reales en los campos ViewState. En primer lugar, se debe configurar EnableViewStatMAC="true" como se describe anteriormente. Luego, establezca el tipo de validación de machineKey en 3DES, es decir,
(4) Bloqueo del estado de vista
El contenido anterior presenta algunos conocimientos básicos sobre el estado de vista. Sin embargo, algunos lectores pueden sentirse confundidos: ¿Qué pasa si los datos del estado de la vista se vuelven muy grandes en algunos casos? Obviamente, esto tendrá algunas consecuencias no deseadas. Con este fin, ASP.NET 2.0 agrega una nueva característica llamada "bloqueo de estado de vista". Si la cantidad de datos en el estado de vista se vuelve demasiado grande, la fragmentación del estado de vista divide automáticamente los datos en múltiples fragmentos y los coloca en múltiples campos de formulario ocultos.
Para habilitar la fragmentación del estado de vista, establezca la propiedad MaxPageStateFieldLength en el tamaño máximo permitido en un único campo de estado de vista, en bytes. Cuando la página se vuelve a publicar en el servidor, la página analiza la cadena de estado de la vista durante la fase de inicialización de la página y restaura la información de propiedad en la página. La configuración predeterminada es -1, lo que significa que no hay un tamaño máximo y el estado de la vista no se dividirá en fragmentos.
(5) Ventajas y desventajas
El uso del estado de vista tiene las siguientes tres ventajas: 1. Consume menos recursos del servidor (en comparación con la Aplicación y la Sesión). Porque los datos del estado de la vista se escriben en la computadora cliente. 2. Fácil de mantener. De forma predeterminada, el sistema .NET habilita automáticamente el mantenimiento de los datos del estado de control. 3. Funciones de seguridad mejoradas. Los valores en el estado de vista se procesan, comprimen y codifican según la implementación Unicode, lo cual es más seguro que usar campos ocultos.
El uso del estado de vista tiene las siguientes tres desventajas: 1. Consideraciones de rendimiento. Debido a que el estado de la vista se almacena en la propia página, si se almacena un valor grande, es posible que el usuario aún se ralentice al mostrar y enviar la página, incluso si el estado de la vista está fragmentado. 2. Limitaciones del equipo. Es posible que los dispositivos móviles no tengan suficiente capacidad de memoria para almacenar grandes cantidades de datos de estado de visualización. Por lo tanto, al mover controles de servidor en un dispositivo, se utiliza un método de implementación diferente. 3. Riesgos potenciales de seguridad. El estado de la vista se almacena en uno o más campos ocultos de la página. Aunque el estado de vista almacena datos en formato hash, puede ser manipulado. Si ve la fuente de salida de la página directamente, puede ver información en campos ocultos, lo que genera posibles problemas de seguridad.
Aplicaciones típicas
En el proceso de desarrollo de controles de servidor utilizando la tecnología ASP.NET 2.0, hay muchos aspectos en los que se puede utilizar el estado de vista. Es común utilizar el diccionario ViewState para implementar propiedades de control del servidor. ViewState es de tipo System.Web.UI.StateBag: un diccionario de pares clave/valor en el que se pueden almacenar los valores de las propiedades de control del servidor. A continuación se utiliza un ejemplo típico para ilustrar el método de aplicación de ViewState.
En el control de servidor personalizado LabelInViewState, se implementan dos propiedades Texto y TextInViewState. El primero se crea utilizando variables privadas y el segundo se implementa utilizando ViewState. Todos se utilizan para obtener o configurar contenido de texto. El código fuente del archivo de implementación de control personalizado LabelInViewState.cs es el siguiente.
usando System; usando System.Collections.Generic; usando System.ComponentModel; usando System.Text; usando System.Web; utilizando System.Web.UI; usando System.Web.UI.WebControls; espacio de nombres WebControlLibrary{ [Propiedad predeterminada ("Texto")] [ToolboxData("<{0}:LabelInViewState runat=servidor></{0}:LabelInViewState>")] clase pública LabelInViewState: WebControl { cadena privada _texto //Implementar el atributo de texto cadena pública Texto { conseguir { return (_text == nulo)? cadena.Vacío: _text; } establecer { _texto = valor } } //Utiliza ViewState para implementar la propiedad TextInViewState public string TextInViewState { conseguir { Cadena s = (Cadena)ViewState["TextInViewState"]; return ((s == nulo) ? String.Empty: s); } establecer { ViewState["TextInViewState"] = valor } } // Anula el método RenderContents protected override void RenderContents(salida HtmlTextWriter) { salida.Write("Texto = "); salida.Escribir(Texto); salida.Write(" "); salida.Write("TextInViewState = "); salida.Write(TextInViewState); } } } |
<%@ Idioma de página="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Hereda="_Default" %> <%@ Registrar Namespace="WebControlLibrary" Assembly="WebControlLibrary" TagPrefix="muestra" %> <script runat="servidor"> void Button1_Click (remitente del objeto, EventArgs e) { demoLabel.Text = TextBox1.Text; demoLabel.TextInViewState = TextBox2.Text; } </guión> <cabeza runat="servidor"> </cabeza> <estilo de cuerpo="font-size: pequeño;"> <form id="form1" runat="servidor"> <div> Nombre: |
El código anterior que se muestra en la página incluye dos cuadros de texto, dos botones y un control de servidor personalizado LabelInViewState. Como se muestra en el controlador de eventos Button1_Click, cuando se hace clic en el botón "Enviar", el control LabelInViewState obtendrá el texto en el cuadro de texto y lo mostrará. Las representaciones de la aplicación se muestran en las Figuras 1 y 2.
Figura 1 Haga clic en el botón enviar | Figura 2 Haga clic en el botón recargar |