Asp .net核心项目:Ajax调用无法到达控制器(400状态代码)

时间:2019-05-12 14:25:07

标签: c# asp.net .net ajax asp.net-core

我正在重构ASP .net核心项目,我想利用一些Ajax调用,但是遇到了以下问题:当我尝试向项目控制器中的方法发送请求时,它不起作用。

我有一个带有以下按钮的模式:

<button onclick="reviewRestaurant(@item.RestaurantId)" class="btn btn-outline-primary">Add review</button>

reviewRestaurant()函数如下所示:

function reviewRestaurant(restaurantId) {
    let rating = $("input[type=radio]:checked").val();
    let review = $('textarea').val();

    let data = { restaurantId, rating, review };

    $.ajax({
        type: "POST",
        url: `/Restaurants/Review`,
        data: JSON.stringify(data),
        success: function (res) {
           // TODO: work on this later
        },
        error: function (err) {
            console.log(err);
        }
    });
}

我想在Restaurants控制器中调用的方法如下:

[Authorize]
[HttpPost]
public async Task<IActionResult> Review(int restaurantId, string rating, string content)
{
    var username = this.User.Identity.Name;
    await this.restaurantsService.Review(restaurantId, username, rating, content);
    return this.RedirectToAction("Details", new { id=restaurantID });
    // the output of this method will be refactored later once I manage to get to it
}   

问题是我无法到达控制器中的Review方法。我得到了400状态码,但我不知道如何解决。我尝试使用DTO和[FormData]属性作为方法参数,并尝试在不进行字符串化的情况下传递数据,仍然行不通。

如果有人可以帮助我,我将非常感激。我对ajax调用比较陌生,根本看不出我的错误在哪里。

2 个答案:

答案 0 :(得分:0)

您可以尝试以下解决方案:

为您的参数(int restaurantId,字符串等级,字符串内容)创建一个通用类,并使用FromBody。 =>评论([FromBody] YourClassName)

并在您的ajax代码中写入此参数。 contentType:'application / json; charset = utf-8', 数据:“ json”

希望它能对您有所帮助。

答案 1 :(得分:0)

这是我正在测试的有效演示。

@section Scripts
    {
    <script>
            function reviewRestaurant(restaurantId) {
                let rating = $("input[type=radio]:checked").val();
                let content = $('textarea').val();
                let data = { restaurantId, rating, content };
                $.ajax({
                    type: "POST",
                    url:'/Restaurants/Review',
                    data: data,
                    success: function (res) {
                        // TODO: work on this later
                    },
                    error: function (err) {
                        console.log(err);
                    }
                });
            }
    </script>
}