以前にファイルアップロードの件でも少し書いたが、asp.net core webappでのファイルダウンロードについて、多分正解というのが分かったので・・・
結局、OnPostやOnGetをvoidで定義するのではなく、下記のようにActionResultを返すメソッドとして定義する。
public IActionResult OnPost(・・・) {
}
処理中でファイルをダウンロードさせたい場合は、File(・・・)を使用して、FileResultを返せば良い。また、ファイルダウンロードでは無く、画面表示をさせたい場合は、Page()を使用して、PageResultを返す。
// Excelファイルのダウンロード
try {
using(xls = new ExcelPackage(new FileInfo(templatepath))) {
// セルに対して値の設定等の処理
・・・
// ちなみに、ファイル名は自動的にurlencode化されるので、
// 事前にUrlEncodeすると変なファイル名になる。
// PageModel.Fileを使用して、FileResultを返す
return File(xls.GetAsByteArray(),"application/octet-stream",filename);
}
} catch (Exception e) {
Message = $"エラー発生{e.Message}";
return Page();
}
なお、File(stream,・・・)を使用する場合、Streamに書き込み等を行っていた場合、ポジションを先頭に戻さないと、実行時エラーが起きるようだ。
Stream stm = MemoryStream();
// メモリストリームに書き込み
・・・
// ポジションを先頭に
stm.Seek(0L,SeekOrigin.Begin);
return File(stm,"application/octet-stream",filename);
やっぱり、基礎を覚えないとだめだね・・・
もちろん、
public async Task Post(・・・)
のように、非同期メソッドとして定義することも可能。