ビューをプリコンパイルするように設定しているため、実行時にビュー ファイル (例: "~\Views\User\Report.cshtml") を読み込もうとすると、次のダミー テキストが表示されます。私の見解の内容に反対:
これは、プリコンパイル ツールによって生成されたマーカー ファイルであり、削除しないでください。
問題は、cshtml ビューを再利用し、実行時に別の方法で再レンダリングしたいのですが、上記の制限によりできません。
シナリオ:
管理者は、/User/Report ルートでユーザーのリストを表示できます。すべてのユーザーのリストと HTML テーブル内の情報を含む HTML を出力します。これらの管理者は、この html ファイル (スタイルとすべて) をダウンロードして、添付ファイルとして他の人に電子メールで送信することを頻繁に望んでいます。もちろん、ブラウザで [ファイル] -> [保存] に移動することもできますが、「このレポートを HTML としてダウンロードする」ページへのリンクを追加して、同じページのコンテンツを強制的に返すだけのリンクを追加することで、その操作を簡素化したいと考えました。ダウンロードした HTML ファイル (2012-07-11_UserReport.html)。
そこで、次のように、ASP.NET の File() メソッドを介して Report.cshtml ファイルの内容を実行して、ビューを再レンダリングしました。
var html = System.IO.File.ReadAllText(Server.MapPath(@"~\Views\User\Report.cshtml"));
var bytes = System.Text.Encoding.UTF8.GetBytes(html);
return File(bytes,"text/html",string.Format("{0}_UserReport.html",DateTime.Now.ToString("yyyy-MM-dd")));
しかし、前に述べたように、ビューをプリコンパイルしているため、ファイルはビューではなくダミーテキストとして返されます。
プリコンパイルを回避するには、単に Report.cshtml ファイルをコピーし、その名前を Report.uncompiled に変更して (もちろん csproj に追加して)、その内容を読み取ることができることを理解しています。これは問題ない解決策です。しかし、十分ではありません。
私が本当に知りたいのは、コンパイル済みのコンテンツを取得する方法はありますか? アセンブリの埋め込みリソースを調べましたが、そこにはありません。アイデア/提案はありますか?
現在のソリューションで更新
そのため、さらに検索した後、WebClient/WebRequest を使用してルートの URL に要求を送信し、応答をユーザーに送信してダウンロードすると同時に、ユーザーの .ASPXAUTH Cookie を渡そうとしました (それにより、.なんらかの理由で WebClient/WebRequest がタイムアウトしましたか? 新しいチケットを作成しようとしても、同じ結果) やりたくないことをやってしまいました: ビュー ファイルを複製し、プリコンパイルされないように名前を変更しました。
ビュー ファイル (Report.uncompiled) をそのまま少し変更する必要があり、 RazorEngine のRazor.Parse メソッドを実行して、必要なものを取得しましたが、ハッキリした感じがしました。コンパイルされた後でも、ビュー ファイル (Report.cshtml) にアクセスする方法が必要です。
var templateHtml = Razor.Parse(System.IO.File.ReadAllText(Server.MapPath(@"~\Views\User\Report.uncompiled")),model);
var bytes = System.Text.Encoding.UTF8.GetBytes(templateHtml);
return File(bytes, "text/html", string.Format("{0}_UserReport.html", DateTime.Now.ToString("yyyy-MM-dd")));