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')发送到控制器?帖子?得到?别的什么?谢谢.
您需要将其作为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').另外,重复一遍,我还没有测试过这个确切的代码,只是编辑了现有应用程序的逻辑.祝好运.
| 归档时间: |
|
| 查看次数: |
19615 次 |
| 最近记录: |