首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >创建带有文件扩展名的ActionResult的推荐方法

创建带有文件扩展名的ActionResult的推荐方法
EN

Stack Overflow用户
提问于 2009-06-13 03:58:00
回答 4查看 13.5K关注 0票数 19

我需要在一个文件类型为.csv的ASP.NET MVC应用程序中创建一个ActionResult。

我会提供一个‘不要呼叫’电子邮件列表给我的营销合作伙伴,我希望它有一个文件类型的.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“的方式来做这件事。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-06-13 12:19:46

我认为在这种情况下,您的响应必须包含"Content-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);
        }
    }
}

并在您的操作中使用它,而不是ContentResult:

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

Stack Overflow用户

发布于 2011-10-19 20:55:20

我使用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");
}

它将为您添加content-disposition标头。

票数 29
EN

Stack Overflow用户

发布于 2009-06-13 04:03:05

这就是我做类似事情的方式。我把它当做下载:

var disposition = String.Format(
  "attachment;filename=\"{0}.csv\"", this.Model.Name);
Response.AddHeader("content-disposition", disposition);

这应该在浏览器中显示为具有给定文件名的文件下载。

不过,我想不出你的方法为什么不能工作。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/989927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档