简而言之:我有一个第三方MVC扩展,它返回FileResult。我希望在将文件返回给客户端之前能够对其进行处理。我该怎么做呢?
如果你对无聊的细节感兴趣,请阅读下面的内容:
我正在使用Devexpress XtraReports进行报告。问题是,它的PDF导出是可怕的,但RTF one工作很好。我想创建动作和结果过滤器,这将欺骗DevExpress生成rtf而不是pdf (完成),并使用其他一些第三方库将rtf转换为pdf。唯一的问题是,我需要从FileResult获取rtf文件,并返回我自己的FileResult与转换后的内容。
//EDIT:现在的代码如下所示:
public virtual ActionResult ReportExport(TParameters parameters)
{
return DevExpress.Web.Mvc.ReportViewerExtension.ExportTo(this.GetReport(parameters));
}
发布于 2012-05-28 19:59:59
您说您正在使用一个返回FileResult
的第三方MVC扩展,并且您希望访问包装在结果中的文件详细信息。
如果你看到FileResult
,它是一个抽象的类,我只知道MVC中有三个内置的实现(我不知道其他的):FileContentResult
,FileStreamResult
和FilePathResult
。
所有这些类都提供了公共属性来访问文件的详细信息。对于ex。FileContentResult
包含一个名为FileContents
的公共属性,该属性以字节数组的形式返回文件内容。
第三方扩展可以返回内置类型的任何FileResult
实现,也可以返回它们自己的类型(如果无法访问这些类型)。您可以检查返回的FileResult
实例的类型,并进行相应的强制转换,以访问文件详细信息。
var fileResult = ... returned by the MVC extension
if(fileResult is FileContentResult)
{
var fileContentResult = fileResult as FileContentResult;
var fileContent = fileContentResult.FileContents;
// process the file
}
else if(fileResult is FileStreamResult)
{
var fileStreamResult = fileResult as FileStreamResult;
var fileStream = fileStreamResult .Stream;
//...
}
else if(fileResult is FilePathResult) // this result only contains the path
// of the file name
{
//...
}
如果您想让这些东西可重用,您可以实现一个自定义文件结果,该文件结果获取由构造函数中的扩展返回的FileResult
并覆盖WriteFile
方法。
发布于 2012-05-28 17:09:18
FileResult可能会将文件内容写入响应流。您可以通过筛选器使用标准ASP.NET响应流。请参阅这篇古老的文章了解详细信息:
http://www.4guysfromrolla.com/articles/120308-1.aspx
或者,您可以创建自己的ActionResult,它使用带有伪响应流的自定义FileResult调用DevExpress HttpContext,您可以在其中进行转换。
https://stackoverflow.com/questions/10781792
复制相似问题