Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ajax请求中下载文件,而无需运行长查询字符串_Ajax_Json_Asp.net Mvc_Download_Query String - Fatal编程技术网

在ajax请求中下载文件,而无需运行长查询字符串

在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/

我有一个asp.net MVC站点和一个控制器操作,如下所示:

  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的一部分返回,因此我正在寻找关于如何既可以返回文件又可以返回文件的建议:

  • 绕过URL中的Internet Explorer 2083字符限制
  • 能够返回PowerPoint文件

  • 我有一个想法向服务器发送一个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;
                }       
            }
        }
    }