如何制作Response.Write(...);在我的控制器中

时间:2013-07-22 09:45:53

标签: c# asp.net asp.net-mvc asp.net-mvc-3

我有一个带有以下方法的控制器:

public void ExportList()
{
    var out = GenExport();

    CsvExport<LiveViewListe> csv = new CsvExport<LiveViewListe>(out);
    Response.Write(csv.Export());
}

这应生成一个用户可以下载的csv文件。

我在视图中通过jQuery请求调用此方法:

$.getJSON('../Controller2/ExportList', function (data) {
    //...
});

问题是,我没有得到任何下载,我不知道为什么。调用该方法但没有下载。

这里有什么问题?

1 个答案:

答案 0 :(得分:6)

您的控制器方法需要始终返回ActionResult。所以该方法看起来应该更像

public ActionResult ExportList()
{
    var export = GenExport();

    CsvExport<LiveViewListe> csv = new CsvExport<LiveViewListe>(export);
    return new CsvResult(csv);
}

CsvResult是继承自ActionResult并继续提示用户下载Csv结果所必需的类。

例如,如果你真的需要Response.Write,那么可能是:

public class CsvResult : ActionResult
{
    private CsvExport<LiveViewListe> data;
    public CsvResult (CsvExport<LiveViewListe> data)
    {
        this.data = data;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        HttpResponseBase response = context.HttpContext.Response;

        response.ContentType = "text/csv";
        response.AddHeader("Content-Disposition", "attachment; filename=file.csv"));

        if (data!= null)
        {
            response.Write(data.Export());
        }
    }
}

如果您的CsvExport课程采用Export方法,您也可以考虑将其设为更通用:

public class CsvResult<T> : ActionResult
{

    private CsvExport<T> data;
    public CsvResult (CsvExport<T> data)
    {
        this.data = data;
    }

    .... same ExecuteResult code
}

现在它支持您的任何csv下载,而不仅仅是LiveViewListe