2011-11-10 3 views
4

ファイルをダウンロードして返すことも、コントローラメソッド呼び出しからビューを更新することもできますか?MVC3コントローラアクションでファイルとレンダリングビューの両方を返す

または、javascript(読み込み後にページの更新を呼び出す)を使用して回避策が必要ですか?

ファイルダウンロードは、ViewModel (ページのさまざまなコントロールからの検索パラメータ)で設定されたパラメータに従ってオンザフライで作成されます。

+1

いいえ、あなたは別の方法を見つけるために持ってしようとしています。 – BNL

答えて

7

あなたの行動からのViewModelかのViewDataを使用してファイルのアドレスを返し、ビューの最後に次のコードに示すようwindow.location.hrefを使用することができます。

コントローラ

public ActionResult Index() 
{ 
    /* ... */ 

    ViewBag.FileName = "{FileName}"; 
    return View(); 
} 

public ActionResult Download(string id) { 
    /* ... */ 

    return File("{Path}", "{MIME type}", "{Desired file name}"); 
} 

マークアップ

<script type="text/javascript"> 

    window.location.href = "/home/download/" + "@Ajax.JavaScriptStringEncode(@ViewBag.FileName)"; 

</script> 
+0

私のファイルがphisicallyではなく、内容が一連のフォームコントロールに依存するストリームの場合はどうなりますか? –

+1

@AlessandroLendaro 'FileResult'は、あなたのためにパスの代わりにストリームを取得するオーバーロードを持っています。また、クエリ文字列またはルートパラメータを使用して、クライアントからサーバーに値を送信することもできます。 –

1

1つのリクエストには1つのレスポンスを持たせることができます。レスポンスヘッダにレスポンスタイプが定義されているので、基本的な答えはノーです。
あなたが見ていることは、ファイルのダウンロードを要求するjavascriptを含むビューを返すことです。

2

ViewResultとともにFileResultを返すことはできませんが、ページが読み込まれると、返されたビューでメタリフレッシュを使用してファイルにリダイレクトすることができます。

<meta http-equiv="refresh" content="600;url=/path/to/the/file" /> 
関連する問題