提问人:Rifat Hussain 提问时间:11/16/2023 最后编辑:Md Farid Uddin KironRifat Hussain 更新时间:11/16/2023 访问量:20
标记帮助程序中的 AJAX 调用未到达引用的项目 .net 7 中的控制器
AJAX Calls in Tag Helpers Not Reaching in referenced project Controllers in .net 7
问:
“我正在开发一个 ASP.NET Core 剃须刀页面应用程序,其中我使用来自单独项目的自定义标记帮助程序。这些标记帮助程序在我的主项目中对各种控制器进行 AJAX 调用。但是,这些 AJAX 调用似乎都没有到达预期的控制器,该控制器位于主项目中引用的单独项目中,从而导致 400(错误请求)错误。
下面是一个 AJAX 调用示例:
$.ajax({
url: '/Intern/pages/edit?action=Put&controller=File', // This is the format I am using
type: 'PUT', // or POST/DELETE, etc., based on the requirement
data: JSON.stringify(someData),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
// Handle success
},
error: function (error) {
// Handle error
}
});
从理论上讲,此调用应该在我的 FileController 中触发一个操作,但事实并非如此。下面是 FileController 的样子:
[ApiController]
[Route("[controller]")]
public class FileController : ControllerBase
{
[HttpPut]
public IActionResult PutMethod(MyModel model)
{
// Action logic
}
}
但是,控制器永远不会被执行。我已经检查了以下内容:
控制器是公共的,并且正确设置了路由属性。 AJAX URL、方法和数据格式与控制器正确匹配。 没有 CORS 问题;标记帮助程序项目和主项目位于同一源上。 我的 ASP.NET Core 应用程序已更新到 .NET 7,即使在确保与新版本兼容后,问题仍然存在。 我还尝试将控制器操作简化为测试连接的基本方法,但没有成功。
是什么原因导致这些 AJAX 调用无法到达控制器?任何见解或建议将不胜感激。
您可以随意修改此草稿,以包含您认为相关的任何其他详细信息,例如特定配置或代码片段。请记住,您的问题越准确、越详细,您就越有可能得到有用的回答。
答:
这些 AJAX 调用似乎都没有到达预期的控制器,这些控制器 位于主项目中引用的单独项目中,导致 400(错误请求)错误。
乍一看,可以说您的请求 URL 不正确。它后面应跟应用程序主机和端口,以及控制器和操作名称。例如:以下 API 在从 razor 页面调用时应具有此功能:http://localhost:5094/api/File/PutMethod
[Route("api/[controller]")]
[ApiController]
public class FileController : ControllerBase
{
[HttpPut("PutMethod")]
public IActionResult PutMethod(MyModel model)
{
return Ok($"Response from API is {model.Email}");
}
}
注意:确保你的控制器类型,我用过API控制器。如果使用 API 控制器,则不需要 razor 页面引用,只需输入 API 控制器的完整 URL。/Intern/pages/edit?
另一点非常关键,那就是 API 操作签名。如果它与参数不匹配,您肯定会遇到 400。
让我们在实践中看一下我们应该如何从 razor 页面 ajax 请求调用 API。
剃须刀页面:
@section scripts {
<script>
function PostAjaxRequest() {
var _apiurl = "http://localhost:5094/api/File/PutMethod";
var reqeustModel = {
Email: "[email protected]"
};
console.log(JSON.stringify(reqeustModel));
$.ajax({
type: 'PUT',
url: _apiurl,
data: JSON.stringify(reqeustModel),
contentType: 'application/json',
headers: {
RequestVerificationToken:
$('input:hidden[name="__RequestVerificationToken"]').val()
},
success: function (data) {
console.log(data);
alert('Data sent to backend!');
},
error: function (xhr, status, error) {
alert('Data was not sent to backend!');
}
});
}
</script>
}
注意:我已经滑动修改了您的代码,因为我喜欢在我的 API 中添加前缀,以便我可以了解哪个是 API 控制器,哪个是 MVC 控制器。此外,我还使用了 API 请求的可选功能,但调用剃刀页面终结点时需要它。api
headers
演示请求模型:
public class MyModel
{
public string? Email { get; set; }
}
输出:
评论