2011-11-15 4 views
1

MVC 3. VB.NET私は生成されたPDFファイルをダウンロードしてユーザーに送信するために、以下のコントローラアクションをアプリケーションに持っています。この関数は、コントローラ自体が呼び出されたときに正常に機能します。しかし、コントローラの外部から関数を呼び出すと、response.contenttype行に達するとすぐに、 "オブジェクト参照がオブジェクトのインスタンスに設定されていません"というエラーが返されます。私は別のコントローラでこれを呼び出そうと私はサイコロは、すべての変数は、実際には、以下のアクションにそれを作っていることを確認していない...しかし、している:HttpResponseオブジェクトヌルエラー

Dim _print as new PrintController 
    _print.showUserPDF(firstName,lastName) 
    return RedirectToAction("Registrants") 

エラーを投げているPrintController内の関数次のとおりです:

Function showUserPDF(ByVal pdfName As String, ByVal fileName As String, ByVal _directory As String) As ActionResult 
     If Not String.IsNullOrEmpty(pdfName) Then 
      Response.ContentType = "application/pdf" 
      Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName) 
      Response.TransmitFile(pdfName) 
      Response.[End]() 

      Dim FileToDelete As String 

      FileToDelete = pdfName 

      If System.IO.File.Exists(FileToDelete) = True Then 
       System.IO.File.Delete(FileToDelete) 
      End If 

      Directory.Delete(_directory) 
      Return Nothing 
     End If 
     Return Nothing 

    End Function 

これは、そのコントローラの内部から明示的に呼び出されたときにのみ有効です。

答えて

3

明らかに、別のコントローラから呼び出されたときにメソッドに設定されたResponseオブジェクトはありません。また、(a)MVCフレームワークによって作成されていないか、(b)HttpContextプロパティを明示的に設定していないControllerContextこれは、実際には、2つのコントローラ間でコンテンツのダウンロードとコードの共有の両方を行う間違った方法です。

まずファイルを削除する可能性があるため、バイト配列をとるシグネチャを使用してFileResultを使用して、ファイルをコントローラからダウンロードして配信する必要があります。 FileResultはこれを行うために明示的に設計されています。コントローラからのレスポンスに直接書き込むべきではありません。これは、MVCの基本的な懸念の分離に違反するためです。

第2に、コードを共有するには、コードを共有ベースコントローラー(抽象クラ​​スまたはヘルパークラス、好ましくは前者)から抽象化する必要があります。そうすれば、フレームワークによって作成されたコントローラで直接メソッドを利用できるようになり、メソッドを呼び出すために別のコントローラをインスタンス化する必要はありません。

最後に、同じ応答でダウンロードしてリダイレクトするファイルを配信することはできません。これが必要な場合は、javascriptを使用してこのクライアント側を処理することができます。ダウンロードしたファイルは同じページに残ります。

ご迷惑をおかけしますが、よろしくご了承ください。私はVBよりも私がそれを書くよりも

1

これはできません。

ASP.Net MVCは、コントローラを作成してアクションを呼び出すときに、多くの初期化を行います。
ControllerContextを作成し、そのHttpContextを設定し、ルート値を解析し、その他のことを行います。

new PrintController()と書くと、そのようなことはありません。