2009-07-06 4 views
8

私はユーザーが記入して提出する必要があるフォームを持っています。コントローラーアクションはいくつかの作業を行い、ユーザーがファイルを持つことができると判断し、FilePathResultである別のアクションにリダイレクトします。私がやりたい何ファイルを同時に送信して新しいページにリダイレクトするMVCの方法は何ですか?

[CaptchaValidator] 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Index(FormCollection collection) 
    { 
     // do some stuff ... 
     return RedirectToAction("Download"); 
    } 


    [AcceptVerbs(HttpVerbs.Get)] 
    public FilePathResult Download() 
    { 
     var fileName = "c:\foo.exe"; 
     return File(fileName, "application/octet-stream", "installer.exe"); 
    } 

は、ファイルが、私をダウンロードするためのおかげで、ユーザが「MVCのような」方法でそれを達成するかどうかはわかりません別のページにユーザーをリダイレクトしています。

私の頭の上から外して考えることができる唯一の方法は、ダウンロードアクションをスキップし、代わりにThankYouアクションにリダイレクトして、ThankYouビューにJavaScriptを使用してファイルを送信させることです。しかし、これはちょうど私にとってMVCには見えません。より良いアプローチがありますか?

結果:

受け入れ答えは十分に正確であるが、私はそれを実装見せたかったです。

それはにリダイレクトindexアクションの変更:私は、ユーザーが任意の「ポストダウンロード情報」を表示するようにして、ファイルをダウンロードするためのありがとうを言うために、このコントローラ(およびビュー)を追加

 return RedirectToAction("Thankyou"); 

。私がlink textから取得したAutoRefresh属性は、他の優れた用途を示しています。

[AutoRefresh(ControllerName="Download", ActionName="GetFile", DurationInSeconds=3)] 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Thankyou() 
    { 
     return View(); 
    } 

前にそれがあったように、これと同じであるためにリダイレクトされますアクション:

[AcceptVerbs(HttpVerbs.Get)] 
    public FilePathResult GetFile() 
    { 
     var fileName = "c:\foo.exe"; 
     return File(fileName, "application/octet-stream", "installer.exe"); 
    } 

答えて

11

はちょうどあなたのリダイレクトされたページのアクションでは、あなたの応答にヘッダを追加します。

グーグルはこのヘッダを思い付いた:私は読んでいたページが数5であり、言うように

Refresh: 5; URL=http://host/path 

あなたのケースではURLは、あなたのダウンロードアクション

へのURLに置き換えられますurlに "リフレッシュする"まで待機する秒数。

ファイルがダウンロードされた状態で、それはあなたの素敵なリダイレクトページを離れて移動するべきではありませんが:)

+0

おかげで...あなたの答えは、私は、このページを発見したいくつかの異なる研究に私を導く: ます。http: //weblogs.asp.net/rashid/archive/2009/04/29/fun-with-http-headers-in-asp-net-mvc-action-filters.aspx –

+1

私は助けてくれるとうれしいです。私は属性メソッドが好きです。それはいい見てください。しかし、それが必要な場合は手動でヘッダーを追加するだけです。 – Sekhat

関連する問題