qq_17031883 2024-03-23 15:54 采纳率: 32.3%
浏览 11
已结题

asp.core 怎么同时让多个用户编辑同一页面

asp.core 怎么同时让多个用户编辑同一页面,并显示在线编辑人数

  • 写回答

19条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-03-23 15:55
    关注
    获得0.45元问题酬金
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    要让多个用户同时编辑同一页面并显示在线编辑人数,可以使用SignalR。 首先,需要在ASP.NET Core项目中安装Microsoft.AspNetCore.SignalR包。然后,在Startup.cs文件的ConfigureServices方法中添加以下代码:
    services.AddSignalR();
    

    接着,在Startup.cs文件的Configure方法中添加以下代码:

    app.UseSignalR(routes =>
    {
        routes.MapHub<EditHub>("/edithub");
    });
    

    在上述代码中,EditHub是自定义的SignalR Hub类,用于处理客户端连接、断开以及消息传递的逻辑,/edithub是Hub的访问路径。 下面是一个简单的EditHub示例:

    public class EditHub : Hub
    {
        private static int _editingUsers = 0;
        public async Task JoinEdit(string pageId)
        {
            // 加入编辑页面
            await Groups.AddToGroupAsync(Context.ConnectionId, pageId);
            // 增加正在编辑的用户数
            Interlocked.Increment(ref _editingUsers);
            // 向所有连接的客户端更新在线编辑人数
            await Clients.All.SendAsync("UpdateEditingUsers", _editingUsers);
        }
        public async Task LeaveEdit(string pageId)
        {
            // 离开编辑页面
            await Groups.RemoveFromGroupAsync(Context.ConnectionId, pageId);
            // 减少正在编辑的用户数
            Interlocked.Decrement(ref _editingUsers);
            // 向所有连接的客户端更新在线编辑人数
            await Clients.All.SendAsync("UpdateEditingUsers", _editingUsers);
        }
        public async Task UpdatePage(string pageId, string content)
        {
            // 在服务器上更新页面内容
            // 这里可以使用持久化方案存储内容
            // 为简化示例,这里只打印内容到控制台
            Console.WriteLine($"Page {pageId} updated: {content}");
            // 向所有连接到该页面的客户端更新页面内容
            await Clients.Group(pageId).SendAsync("UpdatePage", content);
        }
    }
    

    在EditHub中,当客户端连接时,可以使用JoinEdit方法让客户端加入编辑页面;当客户端断开连接时,可以使用LeaveEdit方法让客户端离开编辑页面;当客户端更新页面内容时,可以使用UpdatePage方法更新服务器上的页面内容,并使用SignalR向所有连接到该页面的客户端推送更新。 最后,在页面中添加以下JavaScript代码,用于连接到EditHub、加入/离开编辑页面以及更新页面内容:

    "use strict";
    var connection = new signalR.HubConnectionBuilder()
        .withUrl("/edithub")
        .build();
    // 更新在线编辑人数
    connection.on("UpdateEditingUsers", function (count) {
        document.getElementById("editing-count").innerHTML = count;
    });
    // 更新页面内容
    connection.on("UpdatePage", function (content) {
        document.getElementById("page-content").value = content;
    });
    connection.start().catch(function (err) {
        return console.error(err);
    });
    // 加入/离开编辑页面
    document.getElementById("join-edit").addEventListener("click", function (event) {
        connection.invoke("JoinEdit", "page1").catch(function (err) {
            console.error(err);
        });
    });
    document.getElementById("leave-edit").addEventListener("click", function (event) {
        connection.invoke("LeaveEdit", "page1").catch(function (err) {
            console.error(err);
        });
    });
    // 更新页面内容
    document.getElementById("page-content-form").addEventListener("submit", function (event) {
        event.preventDefault();
        var content = document.getElementById("page-content").value;
        connection.invoke("UpdatePage", "page1", content).catch(function (err) {
            console.error(err);
        });
    });
    

    在上述代码中,/edithub是EditHub的访问路径,page1是编辑页面的ID。连接到EditHub之后,可以使用JoinEdit方法加入编辑页面,使用LeaveEdit方法离开编辑页面,并使用UpdatePage方法更新页面内容。 运行项目,打开多个浏览器窗口访问编辑页面,就可以看到在线编辑人数以及实时更新的页面内容了。

    评论

报告相同问题?

问题事件

  • 系统已结题 3月31日
  • 赞助了问题酬金15元 3月23日
  • 创建了问题 3月23日

悬赏问题

  • ¥15 webstorm上开发的vue3+vite5+typeScript打包时报错
  • ¥15 vue使用gojs,需求在link中的虚线上添加方向箭头
  • ¥15 CSS通配符清除内外边距为什么可以覆盖默认样式?
  • ¥15 SPSS分类模型实训题步骤
  • ¥15 求解决扩散模型代码问题
  • ¥15 工创大赛太阳能电动车项目零基础要学什么
  • ¥20 limma多组间分析最终p值只有一个
  • ¥15 nopCommerce开发问题
  • ¥15 torch.multiprocessing.spawn.ProcessExitedException: process 1 terminated with signal SIGKILL
  • ¥15 QuartusⅡ15.0编译项目后,output_files中的.jdi、.sld、.sof不更新怎么解决