标记帮助程序中的 AJAX 调用未到达引用的项目 .net 7 中的控制器

AJAX Calls in Tag Helpers Not Reaching in referenced project Controllers in .net 7

提问人:Rifat Hussain 提问时间:11/16/2023 最后编辑:Md Farid Uddin KironRifat Hussain 更新时间:11/16/2023 访问量:20

问:

“我正在开发一个 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 asp.net-core razor-pages asp.net-core-tag-helpers

评论

0赞 Md Farid Uddin Kiron 11/16/2023
所以基本上,你想从你的剃刀页面客户端代码调用一个API,并在点击端点时遇到问题,对吗?
0赞 pcalkins 11/17/2023
您确定允许/添加到IIS中PUT谓词吗?

答:

0赞 Md Farid Uddin Kiron 11/16/2023 #1

这些 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 请求的可选功能,但调用剃刀页面终结点时需要它。apiheaders

演示请求模型:

public class MyModel
 {
     public string? Email { get; set; }
 }

输出:

enter image description here

enter image description here