提问人:Katakyie Kofi Poku 提问时间:10/27/2023 更新时间:10/30/2023 访问量:69
如何使用 Ajax 将消息状态从未读更新为已读
How to Update Status of Message From unread to read using Ajax
问:
一旦用户阅读或单击锚标记,我就必须更新消息的状态,以便将特定消息从列表中删除。
我希望使用 AJAX 来更新状态。 这就是我到目前为止所做的
$(document).ready(function () {
$('counterBackground').html = null;
$.ajax({
type: "GET",
dataType: "json",
url: "/Message/GetMessages",
traditional: true,
contentType: "application/json;charset=utf-8",
success: function (data)
{
$('#counter').html(data.length);
let messages = `
<ul>
<li>
<a>
<div>
<img>
</div>
<div>
<div>
<h5><span><small>
<time><span></span></time>
</small></span></h5>
</div>
<p></p>
</div>
</a>
</li>
</ul>`
;
for (let m of data) {
messages += `<ul><li>
<a href="">
<div class="message-avatar">
<img src="https://bootdey.com/img/Content/avatar/avatar3.png" alt="">
</div>
<div class="message-body">
<div class="message-body-heading">
<h5>${m.subject}<span> <small class="fa-pull-right">
<time class="timeago" datetime=""><span>${m.createdDate}</span></time>
</small></span></h5>
</div>
<p>${m.body}</p>
</div>
</a>
</li>
</ul>`
// Setting innerHTML as tab variable
document.getElementById("messageList").innerHTML = messages;
}
console.log(data);
},
error: function (xhr, status, error) { }
});
})
$(function IsRead() {
$.ajax({
Type: 'POST',
dataType: "json",
url: "/Message/UpdateMsgStatus",
traditional: true,
data: { msgId: Id },
success: function (result) {
result.IsRead=1
}
});
})
在我的控制器中,方法是这样的
public JsonResult UpdateMsgStatus(string Id)
{
var msg= ctx.Messages.Where(m => m.MessageId == Id).FirstOrDefault();
if (msg != null)
{
msg.MessageId=Id;
msg.IsRead = 1;
ctx.SaveChanges();
}
return Json(msg);
}
答:
0赞
Ruikai Feng
10/30/2023
#1
一旦用户阅读或单击,我必须更新消息的状态 在锚标记上
AJAX 只会更新当前页面中的消息,如果您想更新其他选项卡中的消息,页面一旦您阅读了 StackOverflow 的收件箱等消息,您必须尝试使用其他技术,例如 SignalR
对于之后创建的元素,必须将事件绑定到文档而不是元素$(document).ready()
<script>
$(document).on('click', '.message', function (e) {
$(this).hide()
})
</script>
此外,由于您使用的是 asp.net 核心,因此您可以创建一个部分视图,而不是在jQuery代码中编写大量HTML
完整的最小示例:
<span id="counter">
</span>
<div class="messagebox">
</div>
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script>
$.ajax({
type: "GET",
url: "/Home/MessagePartial",
success: function (data) {
$('.messagebox').html(data)
$('#counter').html($('.message').length)
}
})
</script>
<script>
$(document).on('click', '.message', function (e) {
$(this).hide()
$('#counter').html($('.message:not([style*="display: none"])').length)
})
</script>
部分视图控制器:
public IActionResult MessagePartial()
{
// in your case,you have to query the messages in db
var messages = new string[] { "Hi", "messages1", "messages2", "messages3"};
return PartialView(messages);
}
局部视图:
@model string[]
@foreach(var message in Model)
{
<div class="message">
@message
</div>
}
结果:
评论
0赞
Katakyie Kofi Poku
10/30/2023
您是否建议我可以使用 ViewComponent 或 Partial View 实现这一点?我不想使用 signalR,因为我想将消息保存在数据库中。
0赞
Ruikai Feng
10/31/2023
您可以将收件箱的代码移动到部分视图中,每次单击消息时,向控制器发送一个返回新部分视图的ajax调用,使用$('.messagebox').html(data)更新当前的部分视图,更新收件箱会更方便
0赞
Ruikai Feng
10/31/2023
您可以打开两个选项卡,然后单击stackoverflow收件箱中的消息,您会发现另一个选项卡中的消息将自动更新。如果你想实现它,你必须尝试使用实时技术,如signalr,调用js代码来更新你在服务器端的另一个选项卡
0赞
Katakyie Kofi Poku
11/6/2023
谢谢你的帮助。我遵循了你的建议,它有帮助。但是,生成的 div 正在浏览我的导航栏。我发现很难让它留在它应该在的地方。
0赞
Ruikai Feng
11/7/2023
嗨,@Katakyie Kofi Poku,您会展示相关的html代码吗?
评论