1

短いバージョン: FileResult を返すサードパーティの MVC 拡張機能があります。ファイルをクライアントに返す前に処理できるようにしたいと考えています。どうやってやるの?

退屈な詳細に興味がある場合は、以下をお読みください。

レポート目的で Devexpress XtraReports を使用しています。問題は、PDF エクスポートがひどいことですが、RTF エクスポートはうまく機能します。DevExpress をだまして pdf の代わりに rtf を生成させる action&result フィルタを作成し (完了)、他のサードパーティ ライブラリを使用して rtf を pdf に変換したいと思います。唯一の問題は、FileResult から rtf ファイルを取得し、変換されたコンテンツで独自の FileResult を返す必要があることです。

//編集: 現在のコードは次のようになります。

        public virtual ActionResult ReportExport(TParameters parameters)
        {
            return DevExpress.Web.Mvc.ReportViewerExtension.ExportTo(this.GetReport(parameters));    
        }
4

2 に答える 2

4

を返すサードパーティの MVC 拡張機能を使用していFileResultて、結果内にラップされているファイルの詳細にアクセスしたいとおっしゃいました。

が表示されている場合、それは抽象クラスであり、MVC で利用できる 3 つの組み込み実装があることをFileResult知っています (他については知りません):FileContentResultと.FileStreamResultFilePathResult

これらのクラスはすべて、ファイルの詳細にアクセスするためのパブリック プロパティを提供します。たとえば。これには、ファイルの内容をバイト配列として返す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-28T11:59:58.510 に答える
3

FileResult は、おそらくファイルの内容を応答ストリームに書き込みます。フィルターを使用して、標準の ASP.NET 応答ストリームを使用できます。詳細については、この古い記事を参照してください。

http://www.4guysfromrolla.com/articles/120308-1.aspx

別の方法として、カスタム HttpContext と偽の応答ストリームを使用して DevExpress FileResult を呼び出す独自の ActionResult を作成することもできます。これは、変換を行う場所です。

于 2012-05-28T09:09:17.927 に答える