не могу получить C #, чтобы сделать загружаемый CSV - PullRequest
5 голосов
/ 23 июня 2011

Мне нужно кодировать кнопку, которая, по щелчку, загружает CSV-файл на компьютер клиента (это веб-приложение).

Итак, проведено какое-то исследование, собрал все строки вместе, иди разберись,он не работает.

Я пытаюсь получить это сейчас:

    protected void btnDownload_onClick(object sender, EventArgs e)
    {
        Response.Clear(); 
        Response.AddHeader("content-disposition", "attachment; filename=tmp.csv");
        Response.ContentType = "text/csv";
        Response.Write("one,two,three,four,five");
        Response.End();
    }

в соответствии с блогом, который появился на Google, это все, что мне нужно, чтобы получить, что CSV скачать его.

только, он не работает, и я не могу понять, что с ним не так.

1) проверка firebug: ответ ПУСТОЙ.
2) VS отладка, странно останавливается после строкиResponse.End() и жалобы на то, что он не может найти контент.

Я что-то упустил?Большое спасибо.очень много.

Редактировать: Я только что кое-что понял, это дочерняя страница, и на главной странице есть панель обновления.Может ли это быть причиной проблемы?Если да, как я могу отменить постбэк ajax только для этой дочерней страницы?

Ответы [ 4 ]

5 голосов
/ 23 июня 2011

чтение ваши комментарии и редактирование, похоже, что вы хотите отменить обратную передачу ajax только для этой кнопки на дочерней странице, а ваша панель обновлений находится на главной странице, и вы не можете получить к ней доступ.

Если я правильно опишу эти данные, просто добавьте этот код в PageLoad () вашей дочерней страницы контента:

        ScriptManager sm = ScriptManager.GetCurrent(Page);
        if (sm != null)
            sm.RegisterPostBackControl(btnDownload); 
        //btnDownload = the button ID, just copied from your code.

Это приведет к полной обратной передаче страницы, и ваши файлы будут загружены.

3 голосов
/ 23 июня 2011

Я бы предпочел сделать это для файла .ashx WebHandler.Отдельно от главной страницы вы находитесь.

<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.Web;

public class Handler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.AddHeader("content-disposition", "attachment; filename=file.csv");
        context.Response.ContentType = "text/csv";
        context.Response.Write("1,2,3,4,5,6");
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}
0 голосов
/ 23 июня 2011

Попробуйте позвонить Response.Flush() между Response.Write() и Response.End(). Кроме того, не используйте <asp:Button для этого. Используйте <asp:HyperLinK (или даже просто обычный <a href якорь), который указывает на другую страницу (или, что еще лучше, обработчик * .ashx), который даст этот ответ.

0 голосов
/ 23 июня 2011

Из того, что я вижу в вашем коде, кажется, что вы отправляете этот ответ как часть постбека.Я не знаю, используете ли вы WebForms (ASPX) или MVC, но если вы используете традиционный ASP.NET, вы можете создать новую страницу под названием «CSV.aspx», удалить весь текст HTML ответа и сделать что-то вродеэто:

в CSV.aspx:

<%@ Page Title="" Language="C#" AutoEventWireup="true"
    CodeBehind="CSV.aspx.cs" Inherits="TestASPNET.CSV" %>

и в коде (CSV.aspx.cs):

public partial class CSV : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.AddHeader("content-disposition", "attachment; filename=tmp.csv");
        Response.ContentType = "application/octet-stream";
        Response.Write("one,two,three,four,five");
    }
}

Также обратите внимание на ContentTypeэто не текст / CSV.

...