asp.net-mvc - 在新数据上刷新 Razor 页面
问题描述
在几个教程之后,我得到了一个 ASP.NET MVC 应用程序,它显示了员工进出和发放设备的仪表板。它是标准的东西,没有什么花哨的东西,SQL Server、Azure、脚手架和 Razor 页面。当通过添加新员工对数据库进行更改时,全屏仪表板视图不会更新,因此我对其进行了 10 秒的刷新(Yuck),这也有效,但我想在有更改时实时刷新数据。按照更多教程,我可以使用 SignalR 将示例文本放入我在仪表板页面上创建的 div 中。我接近我需要的东西,但缺少使用实际数据更新页面的能力,而不仅仅是示例文本。有没有办法让 SignalR 在控制器或视图中刷新/重新加载整个页面?
这是我希望的集线器中的废话代码:
await _messageBrokerHubContext.Clients.All.SendAsync("location.reload(true)");
当然,这很愚蠢。我没有看到任何使用 razor 页面代码的教程,只有 javascript 或 Blazor,所以我质疑我对 SignalR 的理解/实现。
这是我的 Razor 部分代码的示例:
<tbody>
@foreach (var item in Model)
{
<tr class="@(item.ScanDateIn<DateTime.Today ? "text-danger":"" )">
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Plate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Phone)
</td>
<td>
@Html.DisplayFor(modelItem => item.Van)
</td>
<td>
@(item.ScanDateIn<DateTime.Today ? "Missed Punch Out": @Html.DisplayFor(modelItem => item.ScanTimeOut) )
</td>
</tr>
}
</tbody>
这是控制器示例:
public async Task<IActionResult> Index2()
{
var Drivers = driverRepository.GetTodaysDrivers();
if (Drivers == null)
{
RedirectToAction(nameof(Index));
}
return PartialView(await Drivers);
}
教程 SignalR 示例代码:
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
await Task.Delay(1000);
Driver driver = new Driver() { Id = 1, Name = "Neo", ScanDateIn = DateTime.Now, Phone = "555-1212", Plate = "Matrix1" };
var eventMessage = new EventMessage($"Id_{ driver.Id.ToString():N}", $"Title_{driver.Name:N}", driver.ScanDateIn);
await _messageBrokerHubContext.Clients.All.SendAsync("onMessageReceived", eventMessage, stoppingToken);
}
SignalR Javascript 示例代码(所有这些都应该被删除,这是我认为刷新页面代码显示用于控制器或视图的地方??)
let messageCount = 0;
signalrConnection.on("onMessageReceived", function (eventMessage) {
messageCount++;
const msgCountH4 = document.getElementById("messageCount");
msgCountH4.innerText = "Messages: " + messageCount.toString();
const ul = document.getElementById("messages");
const li = document.createElement("li");
li.innerText = messageCount.toString();
for (const property in eventMessage) {
const newDiv = document.createElement("div");
const classAttrib = document.createAttribute("style");
classAttrib.value = "font-size: 80%;";
newDiv.setAttributeNode(classAttrib);
const newContent = document.createTextNode(`${property}: ${eventMessage[property]}`);
newDiv.appendChild(newContent);
li.appendChild(newDiv);
}
ul.appendChild(li);
window.scrollTo(0, document.body.scrollHeight);
});
如果你能做到这一点,谢谢。
解决方案
推荐阅读
- arrays - C指针,了解如何将数组传递给函数
- nginx - 服务器没有响应客户端的 ping
- reactjs - 如何使用 React js 通过 OIDC 实现 SSO 登录
- css - 区分移动端和桌面端
- file - Prestashop“找不到文件问题”
- javascript - 有什么作用!JS中的句尾是什么意思?
- java - 如何在 Spring 拦截器中使用异步服务?
- c# - 何时应该使用 Pipes 或 gRPC 进行进程间通信(在 C# .NET Core 中)?
- object - terraform 数据源无法从远程后端获取
- javascript - ENOENT:没有这样的文件或目录,打开 'C:\Users\subwo\package.json'