我需要在一个文件类型为.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“的方式来做这件事。
发布于 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"
*/
};
发布于 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标头。
发布于 2009-06-13 04:03:05
这就是我做类似事情的方式。我把它当做下载:
var disposition = String.Format(
"attachment;filename=\"{0}.csv\"", this.Model.Name);
Response.AddHeader("content-disposition", disposition);
这应该在浏览器中显示为具有给定文件名的文件下载。
不过,我想不出你的方法为什么不能工作。
https://stackoverflow.com/questions/989927
复制相似问题