2017-08-21 6 views
1

コントローラに保存関数を実行してフォームを保存するボタンがあります。このコントローラは、形式は次のとおりです。1つのコントローラメソッドを使用してFileResultとViewを返す方法

[HttpPost] 
public ActionResult Save(ViewModel model) 
{ 
    Save(model); 
    var newModel = new ViewModel(); 
    return View(Index, newModel); 
} 

と私は、フォームのDownloadFile機能を持っている私は、ユーザーがしばらくの間も、第2の機能を使用してこのファイルをダウンロードすることを可能にできるようにしたいと思い

public FileResult DownloadReceipt(int reportId) 
{ 
    filebytes = CreateFile(reportid); 
    return File(filebytes, MediaTypeNames.Application.Pdf, "file name"); 
} 

最初の機能を使用してユーザーを索引にリダイレクトします。保存ボタンがクリックされると、最初の関数が呼び出されます。必要なビューにリダイレクトしながら、そのボタンを使用してファイルをユーザーのコンピュータにダウンロードする便利な方法はありますか?現在、ダウンロードファイル機能はどこにも呼び出されていません。

+1

ビューとファイルを同時に返すことはできません。リンクを表示してファイルをダウンロードしたり、javascriptでダウンロードしたりすることができます。 – DavidG

+0

'onsuccess'内でリダイレクトしますか? –

答えて

0

コントローラのアクションの背後には、HTTPというプロトコルがあります。このプロトコルは、各要求が単一の応答であることを指定します。したがって、あなたの質問に答えると、1つのリクエストに対して複数のページに応答(返却)することはできません。

しかし、クールダウン、まだ希望があります。私たちはこの行動を偽造する可能性があります。それを偽造する方法はたくさんあります。私はあなたに1つが表示されます:

Index.cshtml:あなたのIndex.cshtmlあなたがダウンロードページへの呼び出しを書くことができて

@if((ViewBag.ReportId as int?) > 0) 
{ 
    <script type="text/javascript"> 
     var url = "@Url.Action("DownloadReceipt", new { reportId = ViewBag.ReportId })"; 
     window.open(url, "_blank"); 
    </script> 
} 
<!-- the rest of index code --> 

あなたのページにこのコードを入れた場合は、できるだけ早くページがロードされると、それは第2ページ(DownloadReceipt)をaltomaticalyで呼び出すことになります。それはあなたが今行う必要があるすべてはあなたのアクションでViewBag.ReportIdに設定されて動作させるために

ViewBag.ReportIdが設定されている場合

[HttpPost] 
public ActionResult Save(ViewModel model) 
{ 
    Save(model); 
    var newModel = new ViewModel(); 
    ViewBag.ReportId = 5; // Change 5 for some code that get report id. 
    return View(Index, newModel); 
} 

は結論するには(そうでない場合は、できるだけ早くそれがロードダウンロードページを呼び出すaltomaticallyますインデックスページViewBag.ReportIdが設定されていない場合)、ダウンロードの呼び出しは行われません。

関連する問題