2009-07-24 23 views
21

La única forma que he encontrado para conservar los valores de propiedad dentro de un control de usuario es usar ViewState.Control de usuario (ascx) y propiedades

public string Title { 
     get { return Convert.ToString(ViewState["Title"]); } 
     set { ViewState["Title"] = value; } 
    } 

No puedo decir que soy real impresionado con esto, sin embargo, ya que las propiedades más un control de usuario tiene la mayor porquería se le pegue en el ViewState. ¿Hay una mejor manera de persistir en las propiedades?

+3

Todos Los controles web lo hacen de la misma manera, es por eso que ViewState se vuelve enorme ... –

+0

tuve que recurrir a esto al final. Es bastante frustrante cómo funciona, pero funciona ... bueno, por ahora ... :) –

Respuesta

10

Depende. Si necesita que los valores de las propiedades persistan más allá de una devolución posterior, tendrá que usar ViewState o Session. Como esos controles se vuelven a crear en cada publicación posterior, en realidad no se puede mantener ese estado.

+0

Sí, los valores de las propiedades deben persistir a través de una devolución de datos. Tengo un botón en el control de usuario que aumenta su evento de botón al hacer clic (duh), y es en este momento que necesito recuperar ciertos valores de propiedad. Bueno, supongo que voy a hinchar el ViewState. – Jagd

+1

"para persistir más allá de un post-back entonces tendrá que usar ViewState o Session". Esto no es verdad para ViewState. ViewState solo persiste entre las publicaciones posteriores, no más allá. – dariom

-1

¿Has probado propiedades estáticas? Además, recuerde que http es apátrida, por lo que puede restablecer el título en cada page_load

+2

Entonces, ¿qué sucede cuando tienes dos solicitudes y ambas quieren usar diferentes propiedades en el control del usuario? –

2

No está tan mal, así es exactamente como funcionan los controles incorporados y generalmente conducirá al comportamiento esperado. La mejor opción es desactivar selectivamente ViewState cuando no necesite persistir estos valores en las devoluciones.

También es posible que desee examinar ControlState: es una "bolsa" separada que la gente no puede desactivar, y se usa para cosas como GridView, donde hay algunas cosas que no se pueden apagar a través de viewstate porque rompe el control.

5

Su problema es exactamente para lo que es ViewState: para mantener las propiedades de un control en las devoluciones, por lo que su solución está bien.

Podrías guardarlo en sesión, pero eso solo pone la carga en el servidor. Dependiendo de la cantidad de usuarios que tenga, esto podría ponerse muy feo rápidamente.

También tenga en cuenta que debe realizar algunas tareas domésticas si utiliza la sesión. Por ejemplo, si desea usar su control de usuario dos veces en la misma página, debe asegurarse de que cada control utilice variables de sesión únicas.

8

No hay ningún problema con el uso de ViewState para almacenar valores de propiedad para un control de usuario.

Su afirmación "cuantas más propiedades controle el usuario más basura tendrá en el ViewState" no es necesariamente cierta. Es ciertamente posible tener valores de seguimiento ViewState de las propiedades para los controles pero no almacenar datos en la variable de campo __VIEWSTATE del formulario oculto.

Suena loco ¿no? Consulte TRULY Understanding ViewState para obtener 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 StateBag para que un control comience a rastrear los cambios en los valores de las propiedades. Esto ocurre en el método OnInit para un control que se encuentra en las primeras etapas del ciclo de vida, pero existen técnicas para establecer los valores de sus propiedades antes que no incurrirán en el costo de __VIEWSTATE hinchazón y aún le darán todos los beneficios.

Vea el artículo vinculado.Se habla de todo, con mucha claridad y mejor de lo que puedo :-)

0

siempre se puede anular los destinados SaveViewState/LoadViewState métodos:

public string Title { get; set; } 

Y a continuación, guardar y cargar a su conveniencia:

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]; 
    } 
} 
Cuestiones relacionadas