javascript - 将 SignalR 2 与数据库相结合

标签 javascript asp.net signalr

我已关注this教程并学习了一个简单的消息传递 Web 应用程序。本教程没有介绍如何将消息添加到数据库以及向用户显示以前的消息。 教程中的核心代码是这样的:

<div class="container">
    <input type="text" id="message" />
    <input type="button" id="sendmessage" value="Send" />
    <input type="hidden" id="displayname" />
    <ul id="discussion">
    </ul>
</div>
@section scripts {

    <script src="~/Scripts/jquery.signalR-2.1.0.min.js"></script>
    <script src="~/signalr/hubs"></script>
    <script>
        $(function () {
            var chat = $.connection.chatHub;
            chat.client.addNewMessageToPage = function (name, message) {
                $('#discussion').append('<li><strong>' + htmlEncode(name) 
                    + '</strong>: ' + htmlEncode(message) + '</li>');
            };
            $('#displayname').val(prompt('Enter your name:', ''));
            $('#message').focus();
            $.connection.hub.start().done(function () {
                $('#sendmessage').click(function () {
                    chat.server.send($('#displayname').val(), $('#message').val());
                    $('#message').val('').focus();
                });
            });
        });
        function htmlEncode(value) {
            var encodedValue = $('<div />').text(value).html();
            return encodedValue;
        }
    </script>
}

如果我使用 EF Code-first 并且我有一个像这样的 Comment 类:

 public class Comment
    {
        public int CommentID { get; set; }
        public string UserName { get; set; }
        public string CommentText { get; set; }
    }

如果我有一个像这样的评论 Controller :

public ActionResult Create([Bind(Include = "CommentID, UserName, CommentText")] Comment comment)
{
    if (ModelState.IsValid)
    {
        db.Comments.Add(comment);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(comment);
}

我知道我需要添加一些ajax代码来显示以前的消息并发送新消息,但我不知道该写什么..你能告诉我如何编写AJAX查询来将数据发布到数据库并列出以前的消息?欢迎任何帮助或提示。谢谢。

最佳答案

您不需要单独的 Controller 。您可以将消息保留在 ChatHub 类中。在 ChatHub.Send 方法中将消息保存到数据库,并通过覆盖 ChatHub.OnConnected 中心事件 - 调用 addNewMessageToPage 向新用户显示以前的消息对于新连接的用户。

public class ChatHub : Hub
{
    public void Send(string name, string message)
    {
        // Call the addNewMessageToPage method to update clients.
        Clients.All.addNewMessageToPage(name, message);

        var comment = new Comment
        {
            CommentID = Guid.NewGuid(), // or find a way to autoincrement an int 
            UserName = name,
            CommentText = message
        }
        db.Comments.Add(comment); 
        db.SaveChanges();
    }

    public override Task OnConnected()
    {
        var comments = db.Comments.ToList(); // some sort of cache would be good here
        foreach(var comment in comments)
        {
            Clients.Client(Context.ConnectionID).addNewMessageToPage(comment.UserName, comment.CommentText);
        }
        return base.OnConnected();
    }
}

关于javascript - 将 SignalR 2 与数据库相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34380571/

相关文章:

javascript 获取当前日期时间

javascript - 更改 RTCPeerConnection 的 MediaStream

c# - 如何获取当前url

c# - SQL Server 的图表构建问题

asp.net - 如何在IIS 6上使HttpCompression(GZip)与URL路由(无扩展URL)一起使用

c# - 如何在 ASP.NET Core 2.2 中使用来自不同托管项目的共享 SignalR Hub

.net-core - SignalR 向组中的所有客户端发送消息,少数客户端除外

asp.net - 阻止用户使用 "X"关闭浏览器窗口?

javascript - Jasmine 测试元素是否淡出

c# - ASP.NET Web 应用程序(.NET 框架)中的 asp.net core SignalR 配置