Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.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
Javascript 为什么从MVC控制器下载的文件返回HTTP 404_Javascript_C#_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

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?}");
    });