jQuery AJAX请求返回HTML而不是JSON结果(剃刀页面)

时间:2018-11-29 15:53:53

标签: c# jquery ajax asp.net-mvc razor

我无法从ASP.NET Core Razor页面中的AJAX请求中提取数据。

Ajax请求代码(包含在剃须刀页面.cshtml页面上的<script>块中:

$("body").ready(function AjaxTest() {
    $.ajax({
        contentType: 'application/json; charset=utf-8',
        dataType: 'text',
        url: '/Menus/Admin_MainMenu?action=TestMethod',
        method: 'GET',
        success: function (data) {
            alert("Request Successful" + data);
        },
        error: function () {
            alert("Request Failed");
        }
    });
})

以及相应的PageModel方法(目前正在测试):

[HttpGet]
public string TestMethod()
{
    string mystring = "success";
    return mystring;
}

我知道请求有效,因为我收到“请求成功”警报。但是,我得到的是与.cshtml页面的布局相对应的HTML字符串,而不是我的值为mystring后跟“请求成功”。

我尝试将数据类型更改为JSON(在AJAX请求中都使用dataType,在方法返回类型中都使用jsonrequest,但这会使请求失败。

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:2)

使用dataType: 'text'时的问题是字符串可能呈现为HTML输出而不是简单字符串。另外,在function AjaxTest()事件中声明ready并不是在AJAX回调中声明函数的正确方法,即使由于范围问题,该语法也是有效的。

您需要使用JsonResult而不是string的返回类型:

public JsonResult OnGetTestMethod()
{
    string mystring = "success";
    return new JsonResult(mystring);
}

然后在AJAX调用中使用handler参数:

$(document).ready(function () {
    $.ajax({
        dataType: 'json',
        url: '/Menus/Admin_MainMenu?handler=TestMethod',
        type: 'GET',
        success: function (data) {
            alert("Request Successful " + data);
        },
        error: function () {
            alert("Request Failed");
        }
    });
});

注意:

1)这里提到的JsonResult不是System.Web.Mvc.JsonResult,它使用Microsoft.AspNetCore.Mvc.JsonResult并且没有JsonRequestBehavior属性。

2)Razor页面使用OnGetOnPost操作方法前缀分别处理HTTP GET和POST,因此[HttpGet]属性是不必要的。

更多参考文献:

Handle Ajax Requests in ASP.NET Core Razor Pages

ASP.NET Core Razor Pages: How to implement AJAX requests