我在 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 种不同的方式更新:
// 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);
});
});
// 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);
});
});
// 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);
});
结果类似于:
步骤 1 和 2 工作正常,但步骤 3 不起作用...
页面加载时出现第一个问题:
jquery.min.js:2 POST https://localhost:44354/api/AjaxAPI/UpdateChartData 400(错误请求)
此外,如果我尝试在浏览器控制台中启动脚本:
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));
为了模拟发布请求,我可以在调试中读取 ApiController 类中的值,但无法正确更新图表的值。
我的完整代码可以在这里找到:https://github.com/DanielScerpa/RazorPageChart/tree/dev_chart
总结:
我想了解当我收到发布请求时如何正确更新我的图表值,并且我想了解启动问题 400(错误请求)
!!!...编辑...!!!
总结:
例如,有人打电话:
<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)更新图表?
根据您的要求,当任何用户向“UpdateChartData”API 发布请求时,您希望 Web 应用程序能够更新图表。
这需要SignalR来进行实时通信。完整的安装演示和教程您可以参考提供的链接。
由于您在项目中使用 .NET Core 2.2 并且此版本已弃用,因此 Microsoft.AspNetCore.SignalR.Common 唯一受支持的版本是版本 1.1.0。下面提供的步骤用于在为 .NET Core 2.2 指定的应用程序中设置 SignalR。
通过NuGet,安装Microsoft.AspNetCore.SignalR.Common 1.1.0
右键项目>管理客户端库,会生成一个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"
]
}
]
}
namespace Razor_WebAPI_Application.Hubs
{
public class ChartHub : Hub
{
public async Task UpdateChart(ChartData chartData)
{
await Clients.All.SendAsync("UpdateChart", chartData);
}
}
}
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
...
services.AddSignalR();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseSignalR(routes =>
{
routes.MapHub<ChartHub>("/chartHub");
});
}
}
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);
}
<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>