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。
在我的应用程序中,我有一个下拉菜单,其中列出了各种客户,第二个下拉菜单将列出与给定客户关联的城市。选择客户应使用相关位置列表填充第二个下拉列表。这是通过触发对控制器中方法的 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。