ASP.NET MVC文件下载和jQuery参数

The*_*ude 2 asp.net-mvc jquery download

我有一个(ViewResult)控制器,它接收一个字符串参数,生成一个PDF文件,并将PDF文件发送回浏览器.我已经测试了控制器本身,它工作正常.不幸的是,当我尝试从$ .ajax jQuery函数(传递一个简单的字符串)发布到此控制器时,Controller 始终接收字符串参数为null.我已经尝试了$ .ajax函数的一百种不同配置.这是控制器,它将PDF返回给浏览器(只要我在方法中创建HTML,它就可以工作):

[HttpPost]
public ActionResult HtmlToPdf(String htmlData)
{ }
Run Code Online (Sandbox Code Playgroud)

这是我在视图中使用的jQuery(通过单击按钮触发):

function getPdf() {
    var htmlData = “blah, blah, etc.”;
    $.ajax({
        url: '/Home/HtmlToPdf',
        type: 'post',
        data: JSON.stringify(htmlData),
        contentType: 'application/json; charset=utf-8',
        success: handleSuccess,
        error: handleError
    });
}
Run Code Online (Sandbox Code Playgroud)

我试过'post','get',json,text,html,stringify,不同的内容类型等等.有没有人知道如何正确地将字符串(上面的var'htmlData')发送到控制器?帖子?得到?别的什么?谢谢.

Sta*_*mer 5

您需要将其作为json对象发送:

function getPdf() {
    var htmlData = “blah, blah, etc.”;
    var dataToPost = { htmlData: htmlData };
    $.ajax({
        url: '/Home/HtmlToPdf',
        type: 'POST',
        data: JSON.stringify(dataToPost),
        dataType: 'json',
        contentType: 'application/json; charset=utf-8',
        success: handleSuccess,
        error: handleError
    });
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过将其声明为您已完成的参数来访问HomeController.关键是您需要将参数的名称作为JSON对象的一部分传递.你的变量名称也是'htmlData'的事实是无关紧要的.以上可以很容易......

var stuff = "blah, etc...";
var dataToPost = { htmlData: stuff };
Run Code Online (Sandbox Code Playgroud)

显然,对于多个参数,您的对象中只有更多项目...

var dataToPost = { arg1: someData, arg2: 2, arg3: true }
Run Code Online (Sandbox Code Playgroud)

...... ......

public ActionResult DoStuff(string arg1, int? arg2, bool? arg3) {}
Run Code Online (Sandbox Code Playgroud)

如果要将数组添加traditional:true$.ajax参数对象.

我还注意到,我总是将'POST'置于大写,因为如果你看一下这里的文档,datatype:参数(例如'json')以小写字母列出,但'GET'和'POST'表示type:在上面案件.

----------------------------更新--------------------- ----

正如评论中所提到的,对于简单的文件下载,使用GET可能更容易.

基本控制器是这样的(我正在修改代码所以没有测试过这个)

public FileResult DownloadFile(string filename)
{
    byte[] fileContent = new byte[0];
    using(FileStream fs = File.OpenRead(filename)) {
        fileContent = new byte[fs.Length];
        fs.Read(fileContent, 0, Convert.ToInt32(fs.Length));
    }
    UTF8Encoding encoder = new UTF8Encoding();
    return File(encoder.GetBytes(fileContent), "applicaton/text", filename);
}
Run Code Online (Sandbox Code Playgroud)

然后在javascript中执行:

$.get('/Home/DownloadFile',
    function(data, textStatus, jqXHR) { /* don't think anything needs to be done */ }
).error(alert('Download failed'));
Run Code Online (Sandbox Code Playgroud)

这显然会下载一个文本文件,因此您需要使用编码(可能/可能不需要一个?)和PDF的contentType字符串(我认为它只是'application/PDF').另外,重复一遍,我还没有测试过这个确切的代码,只是编辑了现有应用程序的逻辑.祝好运.