我有一个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帖子,以避免长查询字符串问题(因为我已经达到了Internet Explorer在URL中2083个字符的限制。
问题是,我不知道如何将文件作为JsonResponse的一部分返回,所以我正在寻找如何同时返回两者的建议:
- 绕过Internet Explorer 2083 URL中的字符限制
- 能够返回PowerPoint文件
我有一个想法向服务器发布ajax,让服务器保存一个文件,然后在jsonResponse中返回路径。然后让客户端再次访问服务器以获取文件。这有道理吗?有没有更优雅的方法可以一步到位?
我将创建返回FileResult
:的普通窗体和控制器Action
@model MyApplication.Models.MyParams
@using (Html.BeginForm("GeneratePPT", "PttDownloader", FormMethod.Post, new { id = "downloadTestForm"}))
{
//form data here
@Html.HiddenFor(model => Model.name)
@Html.HiddenFor(model => Model.age)
<input type="submit"/>
}
正常控制器动作:
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;
}
}
}
}
表单可以由典型的<input type="submit" />
提交,或者如果您需要从Javascript中调用它,您可以使用下面的示例,两种方式都将始终返回文件供下载:
var download = function() {
var downloadTestForm = $('#downloadTestForm');
downloadTestForm.submit();
};
HTTP头告诉浏览器它是来自服务器的文件。在ajax响应中,我们的责任是处理响应,而不是由浏览器自动处理
因此,我们要么必须找出如何在ajax请求的结果中调用浏览器下载对话框。
或
我们只需要从一个ajax请求中捕获文件url,然后使用jquery/javascript代码打开该文件url。这将导致一个文件下载对话框。
我希望这会有所帮助。如果其他人也加入进来,或者如果我错了,纠正我,我会很高兴。
谢谢。
已经回答了类似的问题。我不确定你是否看到了这些问题中的任何一个:
处理从ajax post 下载的文件
Ajax调用下载RESTful服务返回的文件
但两人都得到了答案,他们说这些答案解决了他们的问题。他们的问题听起来和你想要的很相似。