Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I kind of did what Leon suggested as an answer, but instead I used generic handler.</p> <p>1.- Retrieve data from the client, build json &amp; send data to the server (Main Page):</p> <pre><code> function dtExportToCSV(dataTable) { var elements = dtDataToJSON(dataTable); var headers = dtHeadersToJSON(tableSelector); jQuery.ajax({ type: "POST", url: "ashx/Export.ashx", data: "{'elements': " + elements + ", 'headers': " + headers + "}", contentType: "application/json; charset=utf-8", dataType: "json", success: function(msg) { window.open("Export.aspx", "Export CSV", "width=120,height=300"); }, error: function(xhr, ajaxOptions, thrownError) { alert(xhr); } }); return false; } </code></pre> <p>2.- Initialize the session variable (as StringBuilder) for data inter-exchange via aspx pages (Main Page):</p> <pre><code> protected void Page_Load(object sender, EventArgs e) { if (Session["ExportCSV"] == null) { Session["ExportCSV"] = new StringBuilder(); } if (!IsPostBack) { } } </code></pre> <p>3.- Build the CSV (Generic Handler):</p> <pre><code>public class Export : IHttpHandler, IRequiresSessionState { public void ProcessRequest(HttpContext context) { object json = null; byte[] input = null; JavaScriptSerializer javascriptSerializer = null; StringBuilder sb = null; List&lt;object&gt; elementList = null; List&lt;string&gt; headerList = null; try { input = readToEnd(context.Request.InputStream); sb = new StringBuilder(); javascriptSerializer = new JavaScriptSerializer(); foreach (byte chr in input) { sb.Append((char)chr); } json = javascriptSerializer.DeserializeObject(sb.ToString()); elementList = new List&lt;object&gt;(); headerList = new List&lt;string&gt;(); var dictionary = json.toType(new Dictionary&lt;string, object&gt;()); foreach (KeyValuePair&lt;string, object&gt; keyValuePair in dictionary) { switch (keyValuePair.Key) { case "elements": case "ELEMENTS": { object[] elements = (object[])keyValuePair.Value; foreach (object element in elements) { elementList.Add(element); } break; } case "headers": case "HEADERS": { object[] headers = (object[])keyValuePair.Value; foreach (object header in headers) { headerList.Add((string)header); } break; } } } ((StringBuilder) context.Session["ExportCSV"]).Append(writeBodyInfo(elementList, headerList)); ((StringBuilder) context.Session["ExportCSV"]).Append(writeHeadersInfo(headerList)); } catch (Exception ex) { Console.WriteLine(ex.Message); throw; } } } </code></pre> <p>4.- Show up the save file dialog (Export.aspx):</p> <pre><code>public partial class Export : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { exportToCSV(); } } private void exportToCSV() { Context.Response.Clear(); Context.Response.ClearContent(); Context.Response.ClearHeaders(); Context.Response.AddHeader("Content-Disposition", "attachment;filename=ShortageReport.csv"); Context.Response.ContentType = "text/csv"; char[] separator = Environment.NewLine.ToCharArray(); string csv = ((StringBuilder)Session["ExportCSV"]).ToString(); foreach (string line in csv.Split(separator)) { Context.Response.Write(line); } Context.Response.Flush(); Context.Response.End(); } } </code></pre> <p>Any improvement, suggestion?</p> <p>~ Eder Quiñones</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload