AJAX 在服务器上调用 returns 404,在本地工作

AJAX call returns 404 on server, works locally

在我的应用程序中,我有一个下拉菜单,其中列出了各种客户,第二个下拉菜单将列出与给定客户关联的城市。选择客户应使用相关位置列表填充第二个下拉列表。这是通过触发对控制器中方法的 Ajax 调用来实现的,该方法在变量“loc”中传递所选客户的名称。位置列表是通过 EF Core 查询获得的。

这一切在我的本地计算机上都按预期工作,但是当 运行 在我们的服务器上时,它 returns 出现 404 - 未找到错误。

Ajax 调用如下所示:

$.ajax({
     url: "/[Controller]/GetLocations",
     type: "POST",
     dataType: "text",
     data: { 'loc': loc },
     success: function (data, textStatus, jqXHR) {

        var listData = JSON.parse(data);
        resetLocationList();
        for (var listSize = 0; listSize < listData.length; listSize++) {
             $('#ffBankLocation').append('<option value="' + listData[listSize] + '">' + 
             listData[listSize] + '</option>');
        }

     },
     error: function (jqXHR, textStatus, errorThrown) {
        console.log('Error caught: ');
        console.log(errorThrown);
     }
});

控制器中的方法如下所示:

[HttpPost]
public async Task<JsonResult> GetLocations(string loc)
{
    var locations = await _repo.GetLocationsByName(loc);

    return Json(locations);
}

最后,404 错误中报告的 URL 如下所示:

https://[URL]/[Controller]/GetLocations?loc=Some%20Location

鉴于未找到 URL 值,我怀疑之后的设置与问题有任何关系。我唯一想改变的是控制器包含在 Controllers 文件夹 (Controllers/myFolder/Controller) 的子文件夹中,但是将控制器移动到主 Controllers 文件夹,中间没有子文件夹,不会'解决问题。

感谢任何建议。

编辑:为了明确移动控制器,我没有将它从主 Controllers 文件夹中移出,我只是将它从之前找到它的 Controllers 文件夹中的子目录中移出。

尝试删除 [HttpPost],并添加属性路由

[Route("~/mycontroller/GetLocations")]
public async Task<JsonResult> GetLocations(string loc)

如果还是不行尝试把ajax改成

$.ajax({
     url: "/[Controller]/GetLocations?loc="+loc,
     type: "GET",
     dataType: "json",
     success: function (data, textStatus, jqXHR) {

永远不要从默认控制器文件夹中移动控制器

问题已解决。我需要将我的 drop-down 列表转换成一个 @Html.DropDownListFor 对象,并将它包装在一个表单对象中,如下所示:

<form id="custNameForm" asp-controller="myController" asp-action="GetLocations" method="post">
     @Html.AntiForgeryToken()

     @Html.DropDownListFor(x => x.Name, new SelectList((List<string>)ViewBag.custList), "Select Customer",
          new { @class="form-control text-center" })
</form>

接下来,在我的 javascript 文件中,我添加以下“更改”侦听器:

.on('change', '#CustName', function (e) {
     e.preventDefault();
     GetLocations(e);
})

...指向此 jquery 函数:

function GetLocations(e) {
    var loc = $('#CustName option:selected').val();
    var noLoc = loc === '' || loc === 'Select Customer';

    if (!noLoc) {
        var form = $('#custNameForm');
        var url = form.attr('action');
        var token = $('input[name="__RequestVerificationToken"]').val();

        $.ajax({
            url: url,
            type: "POST",
            dataType: "json",
            data: {
                __RequestVerificationToken: token,
                'loc': loc
            },
            success: function (data, textStatus, jqXHR) {

                var listData = data;
                resetLocationList();
                for (var listSize = 0; listSize < listData.length; listSize++) {
                    $('#custLocation').append('<option value="' + listData[listSize] + '">' + listData[listSize] + '</option>');
                }

            },
            error: function (jqXHR, textStatus, errorThrown) {
                console.log('Error caught: ');
                console.log(errorThrown);
            }
        });
    }
    else {
        parseXML('');
    }

    $('#custLocation').prop('disabled', noLoc);
}

...其中“#custLocation 是要填充客户位置列表的下拉列表的 ID。