asp.net - tutorial - Control de usuario(ascx) y propiedades.
programar en asp net (6)
¿Has probado las propiedades estáticas? Además, recuerde que http no tiene estado, así que solo puede restablecer su título en cada page_load
La única forma que encontré para conservar los valores de propiedad dentro de un control de usuario es usar ViewState.
public string Title {
get { return Convert.ToString(ViewState["Title"]); }
set { ViewState["Title"] = value; }
}
Sin embargo, no puedo decir que estoy realmente impresionado con esto, ya que cuantas más propiedades tenga un control de usuario, más mierda se quedará en ViewState. ¿Hay una mejor manera de persistir las propiedades?
Depende. Si necesita que los valores de propiedad se conserven más allá de una devolución posterior, entonces tendrá que usar ViewState o Session. Dado que esos controles se recrean en cada publicación, no se puede mantener ese estado de otra manera.
No está tan mal, así es como funcionan exactamente los controles incorporados y, en general, conducen al comportamiento esperado. La mejor opción es simplemente deshabilitar ViewState de forma selectiva cuando no necesite mantener estos valores en las devoluciones de datos.
También es posible que desee consultar ControlState: es una "bolsa" separada que la gente no puede deshabilitar, y se usa para cosas como el GridView, donde hay algunas cosas que no se pueden desactivar a través de viewstate porque rompe el controlar.
No hay ningún problema con el uso de ViewState para almacenar valores de propiedad para un control de usuario.
Sin embargo, la declaración "cuantas más propiedades tenga un control de usuario tiene más basura que quedará en ViewState" no es necesariamente cierta. Ciertamente, es posible tener valores de seguimiento de las propiedades de los controles de ViewState pero no almacenar datos en la variable de campo de formulario oculto __VIEWSTATE
.
Suena loco ¿verdad? Consulte REALMENTE Entender ViewState para un artículo brillante sobre cómo funciona ViewState.
Depende de cuándo inicialice las propiedades de sus controles en su ciclo de vida. ViewState solo se almacenará en el campo __VIEWSTATE
oculto después de que StateBag
para un control comience a rastrear los cambios en los valores de las propiedades. Esto sucede en el método OnInit
para un control que se encuentra al principio del ciclo de vida, pero existen técnicas para establecer los valores de sus propiedades antes, que no incurrirán en el costo de la __VIEWSTATE
de __VIEWSTATE
y aún le brindarán todos los beneficios.
Ver el artículo vinculado. Discute todo muy claramente y mejor de lo que puedo :-)
Siempre puede anular los SaveViewState
previstos de SaveViewState
/ LoadViewState
:
public string Title { get; set; }
Y luego guardar y cargar según sea necesario:
protected override object SaveViewState()
{
// Save State as a cumulative array of objects.
object baseState = base.SaveViewState();
object[] allStates = new object[2];
allStates[1] = _title;
return allStates;
}
protected override void LoadViewState(object savedState)
{
if (savedState != null)
{
// Load State from the array of objects that was saved during SavedViewState.
object[] myState = (object[])savedState;
if (myState[0] != null)
base.LoadViewState(myState[0]);
if (myState[1] != null)
_title = (String)myState[1];
}
}
Su problema es exactamente para lo que es ViewState: Para conservar las propiedades de un control en todas las devoluciones de datos, su solución está bien.
Podría guardarlo en la sesión, pero eso realmente pone la carga en el servidor. Dependiendo de la cantidad de usuarios que tengas, esto podría ponerse realmente feo muy rápido.
También tenga en cuenta que tiene que hacer un poco de limpieza si utiliza la sesión. Por ejemplo, si desea utilizar su control de usuario dos veces en la misma página, debe asegurarse de que cada control use variables de sesión únicas.