我已关注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/