1

次の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();

}
4

1 に答える 1

2

ファイルのダウンロード応答は、ajax 呼び出しからは達成できません。これを達成する方法はほとんどありません。以下はそのうちの1つです。

$("#exportToExcel").on("click", function (e) {
    var form = $('form');
    var input = $('<input type="hidden" name="input" value="" />');
    input.val($(".jtable").html());
    form.append(input);
    form.attr('action', '/Reports/Export');
    form.attr('method', 'POST');
    form.submit();
})

お役に立てれば。

于 2013-07-06T07:48:19.633 に答える