我在Visual Studio 2019中创建了一个Asp Net Razor项目.

我正在通过一些练习来学习这项技术.具体地说,我想在页面上显示一个图表,我希望通过ApiController检索其数据.

   [Route("api/[controller]")]
    [ApiController]
    public class AjaxAPIController : ControllerBase
    {
        public ChartData chartData = new ChartData();

        [HttpGet]
        [Route("ChartDataJson")]
        public IActionResult ChartDataJson()
        {
            // First example
            var x = new List<double> { 1.0,};
            var y = new List<double> { 10.0,};
            var chartData = new { x, y };
            return Ok(chartData);
        }

        [HttpGet]
        [Route("ChartDataJson2")]
        public IActionResult ChartDataJson2()
        {
            // Second Example
            var x = new List<double> {1.0, 20.0, 30.0 };
            var y = new List<double> {2.0, 30.0,  45.0};
            var chartData = new { x, y };
            return Ok(chartData);
        }

        [HttpPost]
        [Route("UpdateChartData")]
        public IActionResult UpdateChartData([FromBody] ChartData data)
        {
            // Read received data
            var newDataX = data.X; 
            var newDataY = data.Y;
            var chartData = new { x = new List<double>[] { newDataX }, y = new List<double>[] { newDataY } };
            return Ok(chartData);
        }
    }

图表的值可以通过3种不同的方式更新:

  1. Click button 1:用固定值更新图表的值;(Get)
 //  When the button 1 is clicked, get  data from the controller and update the chart
        $("#btnGet").click(function () {
            console.log("button 1 click is executed.");
            $.get("/api/AjaxAPI/ChartDataJson", function (data) {
                updateScatterChart(data);
            });
        });
  1. Click button 2:与点1相同,但值不同;(GET)
         //  When the button 2 is clicked, get  data from the controller and update the chart
        $("#btnGet2").click(function () {
            console.log("button 2 click is executed.");
            $.get("/api/AjaxAPI/ChartDataJson2", function (data) {
                updateScatterChart(data);
            });
        });
  1. Call post:当我从外部收到带有一些json格式数据的POST调用时.(帖子)
        // Update the data chart when a post request is received
        $.post("/api/AjaxAPI/UpdateChartData", function (data) {
            console.log("X values:", data.x);
            console.log("Y values:", data.y);
            updateScatterChart(data);
        });

结果是这样的:

Application

第1步和第2步工作正常,但第3步不工作...

加载页面时会出现第一个问题:

Jquery.min.js:2个帖子 HTTPS://localhost:44354/api/AjaxAPI/UpdateChartData 400(错误请求)

此外,如果我try 在浏览器控制台中启动该脚本:

fetch("https://localhost:44354/api/AjaxAPI/UpdateChartData", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ X: [400.0], Y: [600.0] }),
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error("Error: " + error));

要模拟POST请求,我可以在调试中读取ApiControler类中的值,但不能正确地更新图表的值.

我的完整代码在这里:https://github.com/DanielScerpa/RazorPageChart/tree/dev_chart

总结:

我想了解当我收到POST请求时如何正确更新我的图表值,并且我想了解启动问题400(错误请求)

!!!...EDIT...!!!

总结:你是什么意思?

  1. 在APICONTROLLER中收到POST呼叫时,如何自动更新图表?

例如,有人呼叫:

 <https://localhost:44354/api/AjaxAPI/UpdateChartData>

我通过代码截取POST呼叫:

    [HttpPost]
        [Route("UpdateChartData")]
        public IActionResult UpdateChartData([FromBody] ChartData data)
        {
            // Read received data
            var newDataX = data.X; 
            var newDataY = data.Y;
            var chartData = new { x = new List<double>[] { newDataX }, y = new List<double>[] { newDataY } };
            return Ok(chartData);
        }
    }

此时,如何使用新检索到的值(data.x和data.y)更新图表?

  1. 如何解决启动时出现的404错误?

推荐答案

根据您的要求,您希望在任何用户向"UpdateChartData"API发布请求时更新图表的Web应用程序.

这就要求对SignalR进行实时通信.有关安装和教程的完整演示,请参阅提供的链接.

由于您在项目中使用的是.NET Core 2.2并且此版本已弃用,因此Microsoft.AspNetCore.SignalR.Common唯一支持的版本是1.1.0版.下面提供的步骤用于在为.NET Core 2.2指定的应用程序中设置SignalR.

  1. 通过NuGet安装Microsoft.AspNetCore.SignalR.Common 1.1.0

  2. 右键单击项目Manage Client-side Libraries,它将生成一个libman.json文件.在该文件中,安装@microsoft/signalr库如下:

{
  "version": "1.0",
  "defaultProvider": "unpkg",
  "libraries": [
    {
      "library": "@microsoft/signalr@latest",
      "destination": "wwwroot/js/signalr",
      "files": [
        "dist/browser/signalr.js",
        "dist/browser/signalr.min.js"
      ]
    }
  ]
}
  1. SignalR hub度创建它.
namespace Razor_WebAPI_Application.Hubs
{
    public class ChartHub : Hub
    {
        public async Task UpdateChart(ChartData chartData)
        {
            await Clients.All.SendAsync("UpdateChart", chartData);
        }
    }
}
  1. Configure SignalR in Startup.cs
public class Startup 
{
    public void ConfigureServices(IServiceCollection services)
    {
        ...
        services.AddSignalR();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        ...

        app.UseSignalR(routes =>
            {
                routes.MapHub<ChartHub>("/chartHub");
            });
    }
}
  1. 从DI那里拿到ChartHub美元.并将数据发送给所有客户端.
using Microsoft.AspNetCore.SignalR;
using Razor_WebAPI_Application.Hubs;

[Route("api/[controller]")]
[ApiController]
public class AjaxAPIController : ControllerBase
{

    private readonly IHubContext<ChartHub> _hubContext;

    public AjaxAPIController(IHubContext<ChartHub> hubContext)
    {
        _hubContext = hubContext;
    }
}
[HttpPost]
[Route("UpdateChartData")]
public IActionResult UpdateChartData([FromBody] ChartData data)
{
    // Read received data
    var newDataX = data.X;
    var newDataY = data.Y;
    var chartData = new { x = new List<double>[] { newDataX }, y = new List<double>[] { newDataY } };

    _hubContext.Clients.All.SendAsync("UpdateChart", chartData);

    return Ok(chartData);
}
  1. Add SignalR client code.这样,您就可以等待SignalRHub发出"UpdateChart"事件并更新图表,但不会将POST请求发送到需要请求正文的"UpdateChartData"API.
<script src="~/js/signalr/dist/browser/signalr.js"></script>

<script type="text/javascript">

  ...
  var connection = new signalR.HubConnectionBuilder().withUrl("/chartHub").build();

  connection.on("UpdateChart", function (data) {
      updateScatterChart(data);
  });

  connection.start().then(function () {

  }).catch(function (err) {
      return console.error(err.toString());
  });
</script>

enter image description here

Asp.net相关问答推荐

如何在编译时为我的 ASP.NET 项目中的每个控制器生成一个单独的 OpenAPI Swagger.json 文件?

如何格式化搜索字符串以从 Razor 页表中的多个列返回部分搜索字符串?

如何将 viewbag 显示为 html?

将 NUnit 添加到 ASP.NET MVC 测试框架的选项中

如何使用特定视图(不是控制器名称)返回 ActionResult

在构建时自动停止/重新启动 ASP.NET 开发服务器

即使使用正确的 Accepts 标头,WebAPI 也不会返回 XML

RestSharp 获取请求的完整 URL

使用 IIS 的 ASP.NET 调试超时

ASP.NET URL 重写

MVC 3视图中的当前上下文中不存在名称'HTML'

以编程方式从后面的代码中关闭 aspx 页面

oAuth ASP.NET 成员资格提供程序

如何在 ASP.Net 的客户端 (JavaScript) 上判断 Page.Validate()?

如何在 ASP.net 中使用 wkhtmltopdf.exe

如何将表从存储过程检索到数据表?

使用 VirtualPathProvider 从 DLL 加载 ASP.NET MVC 视图

捕获的异常本身为 null !

LinkBut​​ton 向 OnClick 后面的代码发送值

将字符串转换为时间