2011-02-07 21 views
8

Tengo una página web donde los usuarios deben ingresar la información de contacto del cliente. Podrían ingresar de 0 a un número infinito de contactos.Agregar un control a una lista de controles dinámicamente

he creado este código de página en la página:

<ajaxToolkit:ToolkitScriptManager runat="Server" EnablePartialRendering="true" ID="ScriptManager1" /> 
<asp:PlaceHolder ID="phCustomerContacts" runat="server" EnableViewState="true">/asp:PlaceHolder> 
<asp:LinkButton ID="btnAddContact" runat="server" OnClick="btnAddContact_Click" CssClass="LinkButton" Text="Add Contact"/> 

En mi código detrás añadí esto:

public void btnAddContact_Click(object sender, EventArgs e) 
    { 
     IList<CustomerContactProfile> customerContacts = new List<CustomerContactProfile>(); 
     if (ViewState["CustomerContactList"] != null) 
      customerContacts = (List<CustomerContactProfile>)ViewState["CustomerContactList"]; 
     CustomerContactProfile contactProfile = (CustomerContactProfile)LoadControl("~/Controls/Embedded/CustomerContactProfile.ascx"); 
     customerContacts.Add(contactProfile); 

     foreach (CustomerContactProfile contact in customerContacts) 
      phCustomerContacts.Controls.Add(contact); 

     ViewState["CustomerContactList"] = customerContacts; 
    } 

Este código no funciona debido a que el ViewState no puede manejar el almacenamiento de todos que controlan los datos. Sin embargo, no puedo pensar en otra forma de almacenar los controles que ya fueron agregados.

El viewstate del control asp:PlaceHolder no guarda nada y necesito que los controles se guarden para que si un usuario ingresa algunos datos en el primer control, los datos no se pierdan cuando agreguen un segundo y pronto.

+1

¿Alguna razón particular tiene que estar en Viewstate? Puede probar Session en su lugar. – asawyer

+0

La sesión estaría bien, pero si el usuario abandona la página, ¿no llenaría la sesión? –

+1

La sesión no es el lugar perfecto para el estado basado en página. Por un lado, significa que, a menos que tomara medidas adicionales, el usuario no podría ver dos de estas páginas en dos ventanas separadas, lo que debería ser posible en la mayoría de las aplicaciones web. –

Respuesta

1

En lugar de almacenar todo el control, simplemente almacene los datos subyacentes en la sesión y reconstruya el conjunto de controles a partir de esos datos cada vez que vuelva a cargar la página.

+0

¿Cómo manejarías los datos en el control que se está alterando? Por ejemplo, el control tiene un cuadro de texto: si el valor del cuadro de texto se cambia y la página se vuelve a cargar, el valor modificado se reemplazará con los datos subyacentes de la sesión. – PTuckley

0

No estoy seguro de que sea la mejor forma de agregar contactos dinámicamente. ¿No sería mejor crear controles a través de jquery y enviar datos para la creación a un método web?

+0

jquery es probablemente mejor. Nunca lo he usado. –

0

Sería mejor almacenar el número de controles en viewstate para agregar en su lugar ... Y luego agregarlos en Page Init o PreInit ... ViewState se mantendría para cada uno de los controles dinámicos. Esto sería para las devoluciones de datos después del clic del botón, por supuesto.

HTH.

+0

@Brain - Eso funcionaría, excepto que perdería toda la información en el formulario. –

+0

Ningún viewstate conserva la información modificada, siempre y cuando vuelva a agregar los controles en init o preinit. –

0

Almacena la cantidad de controles que el usuario ha ingresado en el estado de vista. Reemplace el método de la página LoadViewState y agregue la cantidad de controles allí. El marco se encargará de volver a cargar los datos publicados en los controles por usted. No perderás información. Solo tiene que asegurarse de agregar los controles ANTES de que se restablezca ViewState.

0

Almacénelo en la sesión en lugar de Viewstate. ¡Es igual de malo pero funcionará!

0

Creo que no debe depender de ningún almacenamiento temporal para esto: Viewstate, Session u otros.

Parece que está usando su .ascx como si normalmente usara una clase ... Sin embargo, el control del usuario va a ser más grande, imagino, ya que tiene un montón de html (?).

De todos modos, una lista genérica de una clase sería ... más pequeña, al menos.

Pero, por lo demás, mi enfoque favorito es simplemente insertar cada registro en una base de datos cuando se hace (uno por uno), al menos para la entrada manual, que es mi impresión de lo que está trabajando. Por ejemplo, usando una vista de lista, vista de detalles, vista de cuadrícula, etc.

Cuestiones relacionadas