2010-07-01 13 views
7

Tengo un repetidor que muestra los datos financieros y los precios de diversas acciones.¿Cómo puedo persistir los datos de un repetidor después de la devolución?

En esta página, también tengo un botón de "exportación" que necesita tomar los datos ~ en la pantalla ~ y convertirlos en un archivo CSV para el usuario.

El problema es que después de que databind mi lista de entidades "archivo":

List<Stock> stocks = GetStocks() 
rptStockList.DataSource = stocks; 
rptStockList.DataBind(); 

Los datos no se conserva en la devolución de datos.

Además, los datos en esta página se actualizan constantemente a través de un UpdatePanel y un control Timer (siendo re-databound cada vez). Cada 30 segundos cambian los precios mostrados para las distintas existencias en el control del repetidor.

Ahora, tengo un botón de enlace que tiene un método de evento de clic en el código subyacente que se supone que exporta los ~ datos en la pantalla ~ para el usuario. Necesito tomar los valores actuales para la lista de stocks enlazados al último repetidor. No puedo simplemente obtener los últimos valores de la base de datos porque se habrán cambiado en el tiempo transcurrido entre la última actualización.

protected void lbtnExportStocks_Click(object sender, EventArgs e) 
{ 
    // No longer have the stock data used in the repeater control 
    ExportStocksToExcel(); 
} 

Sé que ASP.NET no persiste la fuente de datos para el repetidor en el post-atrás, pero tengo que seguir siendo capaz de o bien volver a construir esta lista de entidades archivo así que les puedo enviar el archivo CSV o necesito persistir de alguna manera.

No quiero hacer nada que sea demasiado pesado en términos de rendimiento, ya que durante ciertos días de la semana esta aplicación puede tener un uso intensivo.

¿Cuál es la solución adecuada para este tipo de situaciones? ¿Debería iterar a través de la colección "Artículos" del Repetidor y reconstruir las entidades de Stock?

+1

Creo que necesita publicar algo de información sobre exactamente lo que 'ExportStocksToExcel()' hace porque el repetidor no debe perder los datos que está ligado a él (suponiendo que no ha deshabilitado viewstate en el control o página) debido a viewstate . Sin embargo, no puede leer los datos hacia atrás desde el repetidor desde su fuente de datos si eso es lo que esperaba (o al menos de forma razonable). –

+0

@Chris Marisic, entonces, teniendo en cuenta lo que escribí anteriormente, ¿cómo recuperarías personalmente los datos del repetidor para generar un CSV? – Darwin

+0

@Chris Marisic, a partir de ahora todo lo que ExportStocksToExcel() hace es configurar el tipo de contenido y encabezado adecuado y luego voy a escribir una respuesta con los datos CSV. Sin embargo, estoy teniendo dificultades para descubrir cómo recuperar esa información. – Darwin

Respuesta

0

Suena como en su método Page_Load que está haciendo algún tipo de enlace a su repetidor. Para tus propósitos, esto es malo, y como habrás visto, no pasará los datos a cada devolución. ¿Puedes asegurarte de que tus cosas en Page_Load sean así? :

Page_Load(...){ 
    if (! Page.IsPostBack){ 
    //first time page loads do this block 

    //stuff 
    //databinding stuff 
    } 
} 
+1

Así es como tengo las cosas actualmente. ¿Cómo ayuda eso el hecho de que en mi llamada al botón de enlace de exportación, los datos no se conservan? – Darwin

+0

@Darwin Los datos pueden persistir. P.ej. si el repetidor incluye cuadros de texto configurables por el usuario, listboxes o casillas de verificación, esos valores * ARE * persistieron en la devolución de datos a menos que usted llame a 'DataBind'. Entonces sus datos * pueden * estar ya en 'ViewState'. Puede verificar teniendo un botón runat = "server" que no hace más que causar un PostBack. Si sus datos * son * persistentes, aún deberían estar presentes después de hacer clic en ese botón. –

1

¿Podría almacenar stocks en Viewstate, o en Session? p.ej.

List<Stock> stocks = GetStocks() 
rptStockList.DataSource = stocks; 
rptStockList.DataBind(); 

ViewState.Remove("stocks"); 
ViewState.Add("stocks", stocks); 

private void ExportStocksToExcel 
{ 
    List<Stock> persistedStocks; 

    persistedStocks = (List<Stock>)Page.ViewState["stocks"]; 
    ... 
} 

estado de sesión puede ser realmente la mejor opción para almacenar Stocks ya que no será transmitida al cliente en la página (con todas las posibilidades del 'edición creativa' que podría conllevar) - que es probablemente muy importante en una aplicación como esta. (Sí, podría encriptar el ViewState, pero con un ojo en esas horas pico que es una sobrecarga que podría no desear).

0

Tomaría la respuesta de Phil y serializaría todo el conjunto de datos, O crearía algún tipo de objeto de criterio que sea pasó a GetStocks() para especificar qué datos obtener. A continuación, serialice y almacene el objeto de criterios en ViewState, de modo que cuando el usuario haga clic en "Exportar", puede extraer los criterios y recuperar los mismos datos.

es decir,

[Serializable] 
public class StockCriteria 
{ 
    public DateTime DateFrom { get; set; } 
    public DateTime DateTo { get; set; } 
    public string[] Symbols { get; set; } 
} 

y luego GetStocks() tiene StockCriteria como parámetro y crea su consulta basada en ella.

+0

Probablemente quiera pasar un solo punto en el tiempo, creo, o el precio de una acción podría cambiar entre DateFrom y DateTo ... – PhilPursglove

1

Un método simple es representar los valores como controles de entrada (en oposición a, digamos, <span> o elementos desnudos) - el navegador envía valores de entrada al servidor cuando el usuario publica.

Por ejemplo:

<ItemTemplate> 
    Symbol: <input type="text" readonly="readonly" name="Symbol" value="<%# Container.DataItem("Symbol") %> /> 
    Quote: <input type="text" readonly="readonly" name="Quote" value="<%# Container.DataItem("Quote") %> /> 
</ItemTemplate> 

El cliente envía cada valor de entrada llamado "símbolo" en una matriz (y asimismo los valores de entrada llamado "Cita"), que se puede acceder en su código subyacente como esto :

protected void lbtnExportStocks_Click(object sender, EventArgs e) { 

    // They come out as comma-delimited strings 
    string[] symbols = Request.Form["Symbol"].Split(','); 
    string[] quotes = Request.Form["Quote"].Split(','); 

    // ... continue exporting stocks to Excel 
} 

por supuesto, en la parte inferior, esta técnica es, básicamente, escribiendo lo que el cliente le envía a un archivo de Excel, así que sería bueno para fijar o limitar la entrada de alguna manera. Eso podría implicar la autenticación de usuarios y/o la regulación de la cantidad de datos que exportará su método. Si esto es una preocupación grave en su entorno o no puede permitirse prestarle demasiada atención, considere en cambio serializar los datos originales en la sesión del usuario.

De manera similar, si está intencionalmente transmitiendo una gran cantidad de datos, debe considerar utilizar otros enfoques por motivos de rendimiento. En su lugar, puede utilizar una sesión o transmitir una pequeña clave que puede usar para reconstruir los datos utilizados para construir el repetidor (por ejemplo, si el repetidor estaba vinculado a los resultados de una consulta que no cambia dado sus entradas, puede simplemente serializar la (s) entrada (s) entre llamadas).

Cuestiones relacionadas