在ajax请求中下载文件,而无需运行长查询字符串
我有一个asp.net MVC站点和一个控制器操作,如下所示:在ajax请求中下载文件,而无需运行长查询字符串,ajax,json,asp.net-mvc,download,query-string,Ajax,Json,Asp.net Mvc,Download,Query String,我有一个asp.net MVC站点和一个控制器操作,如下所示: public ActionResult GeneratePPT(MyParams deckParams) { string template = Server.MapPath("/PPTTemplate.pptx"); var results = _model.GeneratePPT(template); return File(results.Content, "application/
public ActionResult GeneratePPT(MyParams deckParams)
{
string template = Server.MapPath("/PPTTemplate.pptx");
var results = _model.GeneratePPT(template);
return File(results.Content, "application/vnd.ms-powerpoint", results.FileName);
}
问题是:MyParams
对象变得非常大(参数很多),因此我想将其从查询字符串更改为ajax帖子,以避免长查询字符串问题(因为我在URL中达到了Internet Explorer 2083个字符的限制)
问题是,我不知道如何将文件作为JsonResponse的一部分返回,因此我正在寻找关于如何既可以返回文件又可以返回文件的建议:
我有一个想法向服务器发送一个ajax帖子,让服务器保存一个文件,然后在jsonResponse中返回一个路径。然后让客户端再次点击服务器以获取文件。这有意义吗?有没有更优雅的方法一步完成这项工作?我会创建正常的表单和控制器操作,返回
文件结果
:
@model MyApplication.Models.MyParams
@使用(Html.BeginForm(“GeneratePPT”,“PttDownloader”,FormMethod.Post,new{id=“downloadTestForm”}))
{
//这里的表单数据
@Html.HiddenFor(model=>model.name)
@Html.HiddenFor(model=>model.age)
}
正常控制器的动作:
表单可以通过典型的
提交,或者如果您需要从Javascript调用表单,您可以使用下面的示例,这两种方式都将始终返回文件供下载:
var download=function(){
var downloadTestForm=$(“#downloadTestForm”);
downloadTestForm.submit();
};
类似的问题已经得到了回答。我不确定您是否看到以下问题:
但这两个人都得到了他们说解决了他们的问题的答案。他们的问题听起来与您正在寻找的问题相似。响应中的HTTP头告诉浏览器它是来自服务器的文件。在ajax响应中,我们负责处理响应,而不是浏览器自动处理响应 因此,我们必须找出如何在ajax请求的结果中调用浏览器下载对话框 或 我们必须从一个ajax请求中捕获文件url,然后使用jquery/javascript代码打开该文件url,这将导致一个文件下载对话框 我希望这是有帮助的。如果其他人也加入进来,我会很高兴,如果我错了,我会纠正我
谢谢。进行ajax post调用并发送JsonObject(带参数值)为什么不使用常规MVC进行发布?而不是Web Api发布?这样,您的参数将不再达到查询字符串长度限制,您可以发布所有您想要的参数数据。我正在达到Internet Explorer的URL中2083个字符的限制-我将直接解决URL长度问题,而不是尝试工作在极限附近。@SteenTøttrup-你是在建议一篇ajax文章吗?如果是的话,这肯定会解决我的查询问题,但我不知道如何从那篇文章中返回文件。或者你是在建议这样一篇非ajax文章:@RandomBoy-你能举个例子吗,因为我不明白你用pa发送JsonObject是什么意思尝试从asp.net-mvc控制器返回文件时的参数值action@leora,根据您的问题描述,此答案应该可以解决您的问题。向上述方法发送HTTP Post(返回FileResult的方法)。这应该可以很好地解决您的两个问题。我不明白querystring是如何插入到要提交的表单中的。您能否澄清一下,我将如何将类似name=Joe&age=33&wieght=200这样的字符串传递到表单submit中:@leora This is is POST,以便您不传递querystring,在POST方法中,参数是传入的请求正文不在URL中,这解决了您的字符限制问题。@leora参数将自动从表单正文中获取。如果您不了解POST机制,可以尝试此方法
using System;
using System.Web.Mvc;
using System.Net.Mime;
namespace MyApplication.Controllers
{
public class PttDownloaderController : Controller
{
public FileResult GeneratePPT(MyParams deckParams)
{
try
{
//do something with deckParams...
//deckParams.name
//deckParams.age
string template = Server.MapPath("/PPTTemplate.pptx");
var results = _model.GeneratePPT(template);// provide _model
return File(results.Content, MediaTypeNames.Application.Octet, results.FileName);
}
catch (Exception)
{
return null;
}
}
}
}