我想通过在MVC下使用jQuery AJAX调用和一些参数来提供文件下载操作
实施例
(javascript)
function DoDownload(startDate) {
$.ajax({
url:"controller/GetFile/",
data: {startDate:startDate}
...
});
}
C# Controller Code
public void GetFile(string startDate) {
var results = doQueryWith(startDate);
// Create file based on results
....
// How do I tell the server to make this a file download??
}
我通常会让我的文件下载一个链接,例如:
<a h r e f="mycontroller/getfile/1"/>Download</a>
但在上述情况下,日期将是动态的。
如果我不使用ajax,那么使用javascript将params传递给MVC控制器的首选方法是什么?
示例:
window.location = "mycontroller/GetFile/" + $("#fromDate").val();
假设日期是12-25-2012
这会产生吗
mycontroller/GetFile/12/25/2012
MVC会将此视为三个参数吗?
答案 0 :(得分:11)
我最终做的是从我的javascript调用我的控制器:
var url = "/mycontroller/GetFile?startDate=" + $("#mydate").val() + etc...
window.location = url;
mycontroller.cs
public void GetFile(DateTime startDate)
{
}
我最初关心的是日期参数。我不想解析它。
答案 1 :(得分:3)
您可以使用控制器类的File
方法将文件返回给浏览器。
以下示例返回pdf文件。
public ActionResult GetFile(int id)
{
var fileInfo=repositary.GetFileDedetails(id);
var byteArrayOFFile=fileInfo.FileContentAsByteArray();
return File(byteArrayOFFile,"application/pdf","yourFriendlyName.pdf");
}
假设repositary.GetFileDedetails
方法从id返回文件的详细信息。
您也可以从物理位置(路径)或流返回文件。检查File
方法的所有overloads并使用适当的方法。
这与ajax无关。这是浏览器上的正常GET
请求。
答案 2 :(得分:3)
使用ActionLink帮助程序,您可以将多个参数传递给控制器:
HtmlHelper.ActionLink(
string linkText,
string actionName,
string controllerName,
object routeValues,
object htmlAttributes
)
所以在你的情况下:
@Html.ActionLink("Download file", "GetFile", "MyController", new { startDate = "##" }, new { id="mydownloadlink" })
使用jQuery,您可以使用日期选择器或文本框的内容更改链接中startDate
的值。
$("#mydownloadlink").attr("href").replace("##", $("#yourdatetexbox").val);
然后,在您的控制器中,只需使用其中一个其他答案,即FileResult
。
希望这能帮到你......
答案 3 :(得分:1)
您的控制器操作方法应该返回FileResult而不是void。而且没有必要通过AJAX这样做 - 事实上,你不想用AJAX做这件事。您需要涉及的浏览器,因此它知道为用户提供下载对话框。
请参阅以下链接:
Handling an ASP.NET MVC FileResult returned in an (jQuery) Ajax call
File download in Asp.Net MVC 2
我希望这会有所帮助。