【问题标题】:ASP.NET Core MVC AJAX call to Action method not workingASP.NET Core MVC AJAX 调用 Action 方法不起作用
【发布时间】:2018-09-14 07:13:34
【问题描述】:

我是 AJAX 新手,我正在尝试从我的控制器方法中获取一些数据到我的 .js 文件中,以便我可以在我的图表中使用这些数据。 现在每次运行我的项目时,我都会收到自定义错误消息:“加载数据时出错!请重试。” 所以这意味着它正在进入 AJAX 函数,但没有成功。 另外我不知道如何正确调试它以查看哪里出错了。

我在一个单独文件中的 .js 代码如下:

var chartData;

$(document).ready(function () {
$.ajax({
    url: "/Account/GetChartData",
    data: "",
    dataType: "json",
    type: "POST",
    contentType: "application/json; chartset=utf-8",
    success: function (data) {
        chartData = data.d.toString();
        alert("Data is: " + data.d.toString());
    },
    error: function () {
        alert("Error loading data! Please try again.");
    }
}).done(function () {
    //After complete loading data
    drawChart();
});
});

我的控制器方法如下所示:

public static object[] GetChartData()
    {
        var chartData = new object[2];

        //Manually adding some test data
        chartData[0] = new object[]
        {
            "Day",
            "Detected Asparaguses",
            "String Operations",
            "Successful Sting Operations"
        };
        chartData[1] = new object[]
        {
            "21-09-2018",
            100,
            85,
            80
        };
        return chartData;
    }

【问题讨论】:

  • 您可以尝试在GetChartData方法中放置一个调试点来查看AJAX请求是否到达动作。另外,尝试将您的操作方法编写为“public JsonResult GetChartData()”并将返回行编写为“return Json(chartData);”。
  • 您指定了dataType: "json",,但您没有返回 json。将方法更改为[HttpPost] public ActionResult GetChartData() 并使用return Json(chartData);
  • @StephenMuecke 是的!现在我可以看到我在 GetChartData 中的断点被击中,并且 AJAX 成功了。但是它说 data.d.toString() 是“未定义的”。您可能知道该代码是否错误?我只是认为它是正确的,因为我在教程中看到了它
  • data in success: function (data) { 是您返回的模型 - 但您返回的内容确实没有意义(但我不知道您的图表插件是什么或它期望数据采用什么格式.
  • 您在 JSON 字符串中没有任何名为 d 的键,因此 d.toString() 始终未定义。如果要使用d,则需要将其包装为键值对格式。

标签: asp.net-core-mvc asp.net-ajax


【解决方案1】:

您已指定 dataType: "json",但您的方法不返回 json,您将获得 500 (Internal Server Error)。更改方法返回JsonResult

[HttpPost]
public ActionResult GetChartData() // or `JsonResult`
{
    var chartData = new object[2];
    ....
    return Json(chartData);
}

然后 ajax 回调中的 data 将包含您的对象数组。

【讨论】:

  • 也许您可以告诉我如何将参数传递给 ajax 方法并将该参数传递给控制器​​方法?我正在使用 Html.Actionlink 来调用 ajax 函数。 (我删除了 $(document).ready 并创建了一个有名字的函数)
  • 您的意思是在GetChartData() 方法中将值传递给参数吗?如果是这样,您使用data: { xxx: someValue },然后将方法更改为GetChartData( string xxx)(或int 或您想要的任何类型。请注意,如果您不重定向,则使用ActionLink() 没有意义,您也可以只使用<a href="#" id="xx">Do something</a>$('#xx').click(function() { ... }
  • 我在这里解释得更好一点:stackoverflow.com/questions/52328239/…
  • 只需在脚本中使用<a href="#" id="xx" data-id="@field.Id">Details</a>var id = $(this).data('id'); 和在ajax 函数中使用data: { fieldId: id },
  • 但是当我这样做时,我不能在 Account 控制器中调用我的方法字段,对吧?
猜你喜欢
  • 2021-02-06
  • 1970-01-01
  • 1970-01-01
  • 2022-08-21
  • 1970-01-01
  • 2015-07-19
  • 2017-09-29
  • 1970-01-01
相关资源
最近更新 更多