我有一个 (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/