Javascript 为什么从MVC控制器下载的文件返回HTTP 404
我一整天都在研究这些问题,但我觉得我在这里一事无成,所以我转向社区。希望你们这些聪明人能帮助我。 我的项目中有以下控制器操作:Javascript 为什么从MVC控制器下载的文件返回HTTP 404,javascript,c#,asp.net-core,asp.net-core-mvc,Javascript,C#,Asp.net Core,Asp.net Core Mvc,我一整天都在研究这些问题,但我觉得我在这里一事无成,所以我转向社区。希望你们这些聪明人能帮助我。 我的项目中有以下控制器操作: [HttpGet("export")] public IActionResult ExportData(string exportType, DateTime? fromDate, DateTime toDate, string search, bool? locked) { // Load the data from the db.
[HttpGet("export")]
public IActionResult ExportData(string exportType, DateTime? fromDate, DateTime toDate, string search, bool? locked)
{
// Load the data from the db.
var data = LoadData(fromDate, toDate, locked, search);
bytes[] contentBytes = new byte[] { };
switch (exportType)
{
case "csv":
contentBytes = DataHelpers.ExportDataToCSV(data);
break;
// Other cases removed for brevity.
}
var content = new MemoryStream(contentBytes);
return File(content, MediaTypeNames.Application.Octet, "Report.csv");
}
老实说,我不确定导出是否有效,因为我在ajax查询中不断得到HTTP 404:
function dataExport(type) {
const search = document.getElementById("GridSearch").value;
const fromDate = document.getElementById("startDate").value;
const toDate = document.getElementById("endDate").value;
const locked = document.getElementById("LockedStatus").checked;
let args = "?exportType=" + type + "&";
if (search !== null && search.length >= 1) {
args += "search=" + search + "&";
}
if (fromDate !== null && fromDate.length >= 1) {
args += "fromDate=" + fromDate + "&";
}
if (toDate !== null && toDate.length >= 1) {
args += "toDate=" + toDate + "&";
}
if (locked === true || locked === false) {
args += "locked=" + locked
}
if (args.endsWith("&")) {
args = args.substr(0, args.length - 1);
}
// Path is /[area]/[controller]/[action]
// Url output = /r/OtpLock/export?exportType=csv&search=foo
$.get("/r/OtpLock/export" + args, null, function (data) {
console.log(data);
});
}
我没想到这里会有一个404,因为它实际上只是点击了控制器的动作,所以我想可能我的路由没有工作?
app.UseEndpoints(端点=>
{
endpoints.MapRazorPages();
endpoints.MapControllerRoute(
名称:“默认”,
模式:“{controller=Home}/{action=Index}/{id?}”)
我在什么地方出错了吗?是路线问题吗?
提前感谢!使用控制器上指定的路由模板
[路由(“r/[控制器]/[操作]”)
,导出数据操作的路由变为:
r/OtpLock/ExportData
将[HttpGet(“export”)]
添加到ExportData
方法会附加一个现有段export
,该段将其路由更改为:
r/OtpLock/ExportData/export
这不是用于AJAX调用的URL,因此服务器以404响应
要使其按预期运行,有几个选项。例如:
[ActionName(“export”)]
而不是[HttpGet(“export”)]
。这样做的效果是提供export
作为[action]的值
,而不是默认值,即方法的名称,ExportData
。它也不会向控制器级别定义的路由添加任何额外内容[HttpGet(“export”)]
属性,并通过将方法重命名为export
而不是ExportData
,在代码级别重命名ExportData
操作[Route(…)]
属性和[HttpGet(…)]
属性。这将恢复为使用基于约定的路由,这是您使用MapAreaControllerRoute
设置的。这也需要上面的#1或#2,但我不确定这是否适用于您的设置在包含
ExportData
操作的控制器上是否有[Route(…)]
属性?我有…目前它用[Area(“r”)]
和[Route(“r/[controller]/[action]”装饰)
控制器名称是什么?在路由中r
不是额外的吗?试试/r/OtpLock/export
,看看它是否工作基于您所描述的,如果您将[HttpGet(“export”)]
换成[ActionName(“export”)]
,它可能会工作。
endpoints.MapAreaControllerRoute(
name: "areas",
areaName: "areas",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
});