次のASP.NET MVC 4コードを使用してテーブルをエクスポートしようとしています(jTable jqueryプラグインによって生成されますが、それは単なるテーブルであるため関係ありません)。ファイルのダウンロード ダイアログ ボックスは表示されません。
もう 1 つの問題は、HTML でエンコードされたテーブルが .ajax() POST によって送信されるにもかかわらず、.ajax() で値を処理しようとするとエラーがトリガーされることstring inp = Request["input"];
です。[ValidateInput(false)]
[HttpPost] の前後で宣言を使用して、「潜在的に危険な request.form 値がクライアントから検出されました」というエラー (HTML テーブルを送信しているため) を克服しましたが、その宣言は "潜在的に危険な request.form 値...」例外がスローされない -
私の .cshtml ページのコード
$("#exportToExcel").on("click", function (e) {
$.ajax({
url: '/Reports/Export',
cache: false,
dataType: "html",
type: 'POST',
data: { input: $(".jtable").html() },
success: function (data) {
},
complete: function () {
}
});
})
レポートコントローラーのコード:
[ValidateInput(false)]
[HttpPost]
public void Export()
{
//string inp = Request["input"];
string body = "<table><tr><td>2</td><td>3</td></tr><table>";
Response.Clear();
Response.AddHeader("content-disposition", "attachment;filename=data.xls");
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
//Response.ContentType = "application/vnd.ms-excel";
Response.ContentType = "application/force-download";
Response.Write("<html xmlns:x=\"urn:schemas-microsoft-com:office:excel\">");
Response.Write("<head>");
Response.Write("<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">");
Response.Write("<!--[if gte mso 9]><xml>");
Response.Write("<x:ExcelWorkbook>");
Response.Write("<x:ExcelWorksheets>");
Response.Write("<x:ExcelWorksheet>");
Response.Write("<x:Name>Report Data</x:Name>");
Response.Write("<x:WorksheetOptions>");
Response.Write("<x:Print>");
Response.Write("<x:ValidPrinterInfo/>");
Response.Write("</x:Print>");
Response.Write("</x:WorksheetOptions>");
Response.Write("</x:ExcelWorksheet>");
Response.Write("</x:ExcelWorksheets>");
Response.Write("</x:ExcelWorkbook>");
Response.Write("</xml>");
Response.Write("<![endif]--> ");
Response.Write("<![endif]--> ");
Response.Write("</head>");
Response.Write("<body>");
Response.Write(body);
//Response.Write(inp);
Response.Write("</body>");
Response.Write("</html>");
Response.End();
}