Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 创建具有文件扩展名的ActionResult的推荐方法_Asp.net Mvc_Actionresult - Fatal编程技术网

Asp.net mvc 创建具有文件扩展名的ActionResult的推荐方法

Asp.net mvc 创建具有文件扩展名的ActionResult的推荐方法,asp.net-mvc,actionresult,Asp.net Mvc,Actionresult,我需要在ASP.NET MVC应用程序中创建一个ActionResult,该应用程序具有.csv文件类型 我将向我的营销合作伙伴提供一个“请勿致电”电子邮件列表,我希望它的文件类型中有一个.csv扩展名。然后它会自动在Excel中打开 http://www.example.com/mailinglist/donotemaillist.csv?password=12334 我已经成功地做到了以下几点,但我想确保这是绝对最好的推荐方法 [ActionName("DoNotEmailLis

我需要在ASP.NET MVC应用程序中创建一个ActionResult,该应用程序具有.csv文件类型

我将向我的营销合作伙伴提供一个“请勿致电”电子邮件列表,我希望它的文件类型中有一个.csv扩展名。然后它会自动在Excel中打开

 http://www.example.com/mailinglist/donotemaillist.csv?password=12334
我已经成功地做到了以下几点,但我想确保这是绝对最好的推荐方法

    [ActionName("DoNotEmailList.csv")]
    public ContentResult DoNotEmailList(string username, string password)
    {
            return new ContentResult()
            {
                Content = Emails.Aggregate((a,b)=>a+Environment.NewLine + b), 
                ContentType = "text/csv"
            };
    }
此Actionmethod将很好地响应上述链接

我只是想知道,如果像这样的文件扩展名与任何不同版本的IIS、任何类型的ISAPI过滤器或任何我现在想不到的东西有任何意外冲突的可能性


我需要100%确定,因为我将向外部合作伙伴提供此服务,不想以后改变主意。我真的看不出有什么问题,但可能有一些模糊的东西——或者是另一种更像MVC的方式。

我就是这样做的。我将其视为下载:

    [ActionName("DoNotEmailList.csv")]
    public ContentResult DoNotEmailList(string username, string password)
    {
            return new ContentResult()
            {
                Content = Emails.Aggregate((a,b)=>a+Environment.NewLine + b), 
                ContentType = "text/csv"
            };
    }
var disposition = String.Format(
  "attachment;filename=\"{0}.csv\"", this.Model.Name);
Response.AddHeader("content-disposition", disposition);
这将在浏览器中显示为具有给定文件名的文件下载


不过,我想不出你的回复不起作用的原因。

我认为在这种情况下,你的回复必须包含“内容处置”标题。创建自定义ActionResult,如下所示:

public class MyCsvResult : ActionResult {

    public string Content {
        get;
        set;
    }

    public Encoding ContentEncoding {
        get;
        set;
    }

    public string Name {
        get;
        set;
    }

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

        HttpResponseBase response = context.HttpContext.Response;

        response.ContentType = "text/csv";

        if (ContentEncoding != null) {
            response.ContentEncoding = ContentEncoding;
        }

        var fileName = "file.csv";

        if(!String.IsNullOrEmpty(Name)) {
            fileName = Name.Contains('.') ? Name : Name + ".csv";
        }

        response.AddHeader("Content-Disposition",
            String.Format("attachment; filename={0}", fileName));

        if (Content != null) {
            response.Write(Content);
        }
    }
}
并在行动中使用它,而不是在结果中使用它:

return new MyCsvResult {
    Content = Emails.Aggregate((a,b) => a + Environment.NewLine + b)
    /* Optional
     * , ContentEncoding = ""
     * , Name = "DoNotEmailList.csv"
     */
};

我使用FileContentResult操作也做了类似的事情

public FileContentResult DoNotEmailList(string username, string password)
{
        string csv = Emails.Aggregate((a,b)=>a+Environment.NewLine + b);
        byte[] csvBytes = ASCIIEncoding.ASCII.GetBytes( csv );
        return File(csvBytes, "text/csv", "DoNotEmailList.csv");
}

它将为您添加内容处置标题。

您接受的答案足够好,但它在输出内容时会将输出内容保留在内存中。如果生成的文件相当大怎么办?例如,当您转储SQL表的内容时。您的应用程序可能内存不足。在这种情况下,您需要使用FileStreamResult。将数据输入流的一种方法是使用管道,

谢谢!但是你能澄清你所说的必须是什么意思吗?我所做的似乎是可行的——尽管这种方式更可取——如果您的操作返回“.csv”文件,那么您的客户希望“打开”或“保存”它——所以您必须提供“内容处置”标题(尽管它是可选的,请参阅)。如果没有此标题,打开文件的过程可能在不同的浏览器/操作系统/机器中有所不同。代码中有错误吗?名称不应该是字符串而不是编码吗?另外,编译器告诉我ActionResult没有响应属性。我发现了错误(
Response.Headers.Add…
)-已修复(应该是
Response.Headers.Add…
)-再次感谢AD。运行此代码时出错(MVC2,ASP.Net 3.5):“此操作需要IIS集成管道模式”。看起来需要更改response.Headers.Add到response.AddHeader-这比编写一个类来完成一些已经内置的事情更有意义!干杯感谢您提供了一个简单明了的答案,在其他情况下很容易实现