2011-01-13 14 views
13

Stephen Walther tipに基づいてMicrosoft Excelドキュメントを返すExcelResultアクション結果があります。基本的にはストリームをレスポンスに書き出すだけです。 VS 2010(ASP.NETのDev Server)をデバッグするとき、それが正常に動作しますが、私は、IIS 6のボックスにそれを実行すると、私は次のエラーを取得する:ビューなしでMVCコントローラのアクションを実行しますか?

The view 'GenerateExcel' or its master was not found. The following locations were searched: ~/Views/Home/GenerateExcel.aspx ~/Views/Home/GenerateExcel.ascx ~/Views/Shared/GenerateExcel.aspx ~/Views/Shared/GenerateExcel.ascx

そこには関連するビューがありませんので、ノーファイルしかし、そうすべきではありません。私は間違って何をしていますか?

UPDATE

単に代わりのActionResultの空隙を返すことによって、私はもはやこの問題を持っていません。 ExcelResultを返すのではなく、明示的にExecuteResultメソッドを呼び出しています。これは出力ストリームに書き込みます。

public ActionResult GenerateExcel() 
{ 
    return this.Excel(parameters); 
} 

その後

public void GenerateExcel() 
{ 
ExcelResult excelResult = this.Excel(parameters); 
excelResult.ExecuteResult(null); 
} 

した後、私は私のNTLM認証とセキュリティ上の問題があったが、彼らは私は彼らが戻ってくることを期待する意味( '去っていきました' )。今のところ、すべてが適切に機能しています。

+1

あなたが何をしているのかを示すことなく、あなたが間違っていることを言うのは少し難しいと感じませんか?残念ながら、私はテレパシー能力を持っていません。 –

+0

あなたは基本的にリンク上のコードを見ることができます。 ExecResultメソッドが出力ストリームに書き込む実際のExcelResultであるActionResultを返します。 – DougJones

答えて

13

は、あなたのアクションメソッドがのActionResultを返さないことを確認してください:

public void DoSomething() 
+3

ああ、それぞれのアクションはActionResultを返す必要はありません。この場合、彼はカスタムアクションの結果であるが、依然としてアクション結果である「ExcelResult」を望んでいる。 –

+0

コントローラ内のすべてのパブリックメソッドはアクションメソッドであり、適切なURLで呼び出すことができます。彼はレスポンスにストリームを書き込んでいる間に動作することができます。 –

+0

それは別のエラーに私を得た!添付のExcelの代わりに空白のページが表示されました。私はFiddlerで見ましたが、NTLMのWindows認証よりも401アクセスの拒否エラーが出ていますが、他のコントローラのアクション(ビュー付き)はうまく表示されます。 – DougJones

0

私はあまり詳細にアクションの結果のコードを見ていなかったが、あなたの行動の結果に異常がなければなりません。 ActionResultクラスではなく、他のアクション結果から継承しましたか?あなたはbase.ExecuteResultを呼び出しましたか?もしそうなら、それはなぜそれが見解を探しているのかを説明するでしょう。さまざまなファイルタイプを返すためのカスタムコントローラアクションをいくつか作成しましたが、ビューを探すことはありません。

私は、返品に関する返品に関するコメントに同意します。それは間違いなくハックです。アクション内からExecuteResultを呼び出さないでください。あなたは基本的に、コントローラのアクションからの応答ストリームに直接書き込んでいます。明らかにそれは動作しますが、実際にはMVCモデルに適合しません。

3

これは、数百または数千のビューを持つシナリオでは非常に便利です。その場合、数百または数千のコントローラーアクションが作成されますか?もちろんそうではありませんが、どうすれば修正できますか?

MVCフレームワークでは、コントローラークラスには、存在しないコントローラー上でアクションを呼び出そうとするたびに(または、一致するアクションメソッドを持たないビューを要求するとき)実行されるHandleUnknownAction()メソッドが含まれています。私は信じて

enter image description here

が、これは、あなたの質問に答えます。

関連する問題