Я сделал то, что Леон предложил в качестве ответа, но вместо этого я использовал общий обработчик.
1.- Извлечение данных из клиента, сборка JSON и отправка данных на сервер (главная страница):
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;
}
2.- Инициализируйте переменную сеанса (как StringBuilder) для обмена данными через страницы aspx (главная страница):
protected void Page_Load(object sender, EventArgs e)
{
if (Session["ExportCSV"] == null)
{
Session["ExportCSV"] = new StringBuilder();
}
if (!IsPostBack)
{
}
}
3.- Создайте CSV (универсальный обработчик)):
public class Export : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
object json = null;
byte[] input = null;
JavaScriptSerializer javascriptSerializer = null;
StringBuilder sb = null;
List<object> elementList = null;
List<string> 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<object>();
headerList = new List<string>();
var dictionary = json.toType(new Dictionary<string, object>());
foreach (KeyValuePair<string, object> 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;
}
}
}
4.- Показать диалоговое окно сохранения файла (Export.aspx):
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();
}
}
Есть ли какие-либо улучшения, предложения?
~ Eder Quiñones