2011-09-14 15 views
7

Tengo un problema por el cual el estado de visualización de un repetidor, es decir, los controles dentro del repetidor, no mantienen su estado de visualización.Mantenimiento del estado de visualización de un repetidor

Tengo el siguiente:

Repetidor 1:

<asp:Repeater ID="rptImages" runat="server"> 
<ItemTemplate> 
    <asp:LinkButton Text="Add" CommandName="Add" CommandArgument=<%# Eval("ID") %> runat="server" /> 
</ItemTemplate> 
</asp:Repeater> 

Cuando el botón de enlace se hace clic en el valor de la CommandArgument se almacena en un campo oculto en la página.

En la devolución de datos no puedo obtener el valor del campo oculto hasta que se haya cargado el controlador de eventos prerender. Así que en mi caso prerender me agarra el valor del campo oculto y lo almacenan en una propiedad de lista, así:

if (!string.IsNullOrEmpty(this.SelectedImageIDsInput.Text)) { 
     this.ImageList.Add(this.SelectedImageIDsInput.Text); 
    } 

Y la propiedad lista se ve así:

public List<string> ImageList { 
    get { 
     if (this.ViewState["ImageList"] == null) { 
      this.ViewState["ImageList"] = new List<string>(); 
     } 
     return (List<string>)(this.ViewState["ImageList"]); 
    } 
    set { this.ViewState["ImageString"] = value; } 
} 

Una vez que haya almacenado el valor de mi propiedad en la lista I unir mi segundo repetidor (de nuevo dentro del evento prerender):

this.rptSelectedImages.DataSource = this.LightBoxControl.ImageList; 
this.rptSelectedImages.DataBind(); 

el segundo repetidor tiene una lista desplegable y un cuadro de texto dentro de ella. El problema es que no se mantiene el viewstate de estos controles secundarios. Supongo que es porque con cada devolución de datos estoy reencuadernando el repetidor, por lo tanto, se reconstruye. Lo que no sé es cómo puedo evitar esto? La propiedad ImageList solo se actualiza con una devolución de datos, así que obviamente tengo que volver a enlazar el repetidor con cada devolución de datos. ¿De qué otra forma se puede hacer?

Cualquier ayuda sería muy apreciada.

Gracias Al

Respuesta

13

Si está REBINDING el repetidor, tiene que hacerlo en Init antes de cargar el ViewState.

También debe verificar IsPostback y solo enlazar el repetidor cuando la página no se devuelve.

Para aclarar si su segundo repetidor está encuadernado por PreRender continuación ViewState no puede ser utilizado para persistir los controles, porque simplemente no existen cuando se carga ViewState - Init después, y antes de PreLoad.

Debe continuar vinculando en cada devolución, o almacenar o enumerar en Session para que tenga acceso a la lista para vincular una vez en Init, (o en el cambio).

+0

Hola CodeKing. Sin embargo, hay dos problemas: no puedo obtener el valor del campo oculto tan pronto como el evento Init, más la propiedad ImageList solo se puede actualizar en la devolución de datos ... – higgsy

+0

En ese caso, debería volver a enlazar el segundo repetidor en cada llamada usando el valor en el campo oculto. – TheCodeKing

+0

Hola CodeKing: eso es exactamente lo que estoy haciendo, ¿o no? ¿Estoy malinterpretando tu respuesta? Actualmente espero hasta la entrega para obtener el valor del campo oculto y luego volver a vincular el repetidor. El problema con esto es que el estado de vista de los controles en el repetidor no persiste en las devoluciones ... – higgsy

0

No veo el punto de copiar la propiedad CommandArgument a un campo oculto. Lo que debe hacer es usar el evento ItemCommand en el Repeater y usar el evento de borboteo. Puede controlar el evento en que ClickLinkButton como esto:

repeater.ItemCommand += (sender, eventArgs) => { 
    var commandArgument = eventArgs.CommandArguments; 
    ImageList.Add(commandArgument); 
    rptSelectedImages.DataSource = ImageList; 
    rptSelectedImages.DataBind(); 
} 
+0

Hola, Mikael: sé que parece una locura copiarlo en un campo oculto. El problema es que también tengo una imagen jQuery cargada en la misma página: una vez que el archivo se cargó, el manejador devuelve el nuevo ImageId, por supuesto, JS no puede llamar a ImageList.Add, por lo que debe almacenarse en un campo oculto. ¿Tiene sentido? – higgsy

Cuestiones relacionadas