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

标签 jquery asp.net-mvc download

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

[HttpPost]
public ActionResult HtmlToPdf(String htmlData)
{ }

这是我在 View 中使用的 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
    });
}

我尝试过“post”、“get”、json、text、html、stringify、不同的内容类型等。有谁知道如何正确地将字符串(上面的 var“htmlData”)发送到 Controller ?邮政?得到?还有别的事吗?谢谢。

最佳答案

您需要将其作为 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
    });
}

然后,您只需将其声明为参数即可访问 HomeController,就像您所做的那样。要点是您需要将参数名称作为 JSON 对象的一部分传递。您的变量名称也是“htmlData”这一事实是无关紧要的。上面的内容很容易......

var stuff = "blah, etc...";
var dataToPost = { htmlData: stuff };

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

var dataToPost = { arg1: someData, arg2: 2, arg3: true }

...与...

public ActionResult DoStuff(string arg1, int? arg2, bool? arg3) {}

如果要传递数组,请将 traditional:true 添加到 $.ajax 参数对象。

我还注意到,如果您查看文档 here,我总是将“POST”大写。 datatype: 参数(例如“json”)以小写形式列出,但 type: 的“GET”和“POST”以大写形式列出。

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

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

基本 Controller 类似于(我正在精简代码,所以还没有测试过这个)

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);
}

然后在 JavaScript 中执行:

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

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

关于jquery - ASP.NET MVC 文件下载和 jQuery 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20693803/

相关文章:

javascript - @keyframes 动画文字淡入淡出

c# - User.Identity.Name 返回 guid

asp.net-mvc - 避免使用 foreach for @html.checkboxfor

javascript - 有谁知道为什么 res.download 每次都给我的下载文件一个随机名称?

java - 在android中使用服务下载多个文件

java - Velocity - 使用 jQuery 时如何避免 ParseErrorException?

javascript - 选择 DIV 内部

javascript - 在父 div 中滚动子 div

jquery - 为什么 jquery ui 对话框会破坏 asp.net mvc 的默认模型绑定(bind)。

windows-8 - Windows 8 Metro 应用离线下载