У меня есть система обмена сообщениями в представлении MVC, которая получает все данные из модели.
В этом представлении у меня есть вызов ajax для веб-API, который обновляет базу данных, когда кто-то отправляет ответ или новое сообщение. Мне бы хотелось, чтобы была запущена функция обратного вызова, чтобы она обновляла часть экрана, которая показывает все сообщения чата из системы обмена сообщениями.
Jquery Ajax call
<script>
$(document).ready(function () {
$("#sendMessage").on("click", function (e) {
e.preventDefault();
var MessageReplyParam = $('#messageToBeSent').val();
var FromUserNameParam = $('#FromUserName').val();
var FromUserIDParam = $('#FromUserID').val();
var ToUserNameParam = $('#ToUserName').val();
var ToUserIDParam = $('#ToUserID').val();
var button = $(this);
$.ajax({
//url: "/api/messages/SendMessages?MessageID=" + button.attr("data-message-id"),
url: "/api/messages/SendMessages",
method: "POST",
data:{
lngMessageID: button.data("message-id"),
Reply: MessageReplyParam,
FromUserID:FromUserIDParam,
FromUserName:FromUserNameParam,
ToUserID: ToUserIDParam,
ToUserName: ToUserNameParam
},
dataType: 'html',
success: function (data) {
$('#partial').html(data);
}
});
});
});
</script>
Веб-API
public HttpResponseMessage SendMessages([FromBody]MessageReply message)
{
//Add a message to MessageReply table
dynamic model = new { Name = "" };
_context.MessageReply.Add(message);
_context.SaveChanges();
var messagesReplies = from mrp in _context.MessageReply
where mrp.lngMessageID == message.lngMessageID
select mrp;
List<MessageReply> MessageReplies = new List<MessageReply>();
MessageReplies = messagesReplies.ToList();
var response = new HttpResponseMessage();
response.Content = new StringContent(@"<div class='messages'><div class='bg-dark rounded padding-x4'>
<span>test</span></div></div>");
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
return response;
}
Контроллер
public ActionResult BookingInfo(BookingViewModel bvm, int? BookingId)
{
//This class will be used from All Bookings Link by passing in BookingID
//Get the data from bookingID and show the booking details with messages
//and option to send message
BookingViewModel bvl = new BookingViewModel();
if (Request.IsAjaxRequest())
{
return PartialView("_MessagesView", bvl.MessageReplies);
}
var BookingInformation = from booking in _context.Booking
join pets in _context.PetInformation
on booking.BookingID equals pets.lngBookingID
join customer in _context.Customers
on booking.ServiceProviderID equals customer.strUserID
join requester in _context.Customers
on booking.strUserID equals requester.strUserID
join msg in _context.Messages
on booking.BookingID equals msg.lngBookingID into mt
from submsg in mt.DefaultIfEmpty()
where booking.BookingID == BookingId
select new { bk = booking, pt = pets,cst = customer, req = requester,mst = submsg};
//Get Message Replies
int messageId = 0;
foreach (var bi in BookingInformation)
{
bvl.Booking = bi.bk;
bvl.Pets = bi.pt;
bvl.ServiceProvider = bi.cst;
bvl.ServiceProviderName = bi.cst.Name;
bvl.RequesterName = bi.req.Name;
bvl.Booking.strUserID = bi.bk.strUserID;
bvl.Booking.ServiceProviderID = bi.bk.ServiceProviderID;
messageId = bi.mst.MessageID;
bvl.Messages = bi.mst;
}
if (bvl.Booking.ServiceProviderID == User.Identity.GetUserId())
{
bvl.FromUserID = bvl.Booking.ServiceProviderID;
bvl.ToUserID = bvl.Booking.strUserID;
bvl.FromUserName = bvl.ServiceProviderName;
bvl.ToUserName = bvl.RequesterName;
}
else
{
bvl.FromUserID = bvl.Booking.strUserID;
bvl.ToUserID = bvl.Booking.ServiceProviderID;
bvl.FromUserName = bvl.RequesterName;
bvl.ToUserName = bvl.ServiceProviderName;
}
var MessageReplies = from msg in _context.MessageReply
where msg.lngMessageID == messageId
select msg;
if (MessageReplies.Count() > 0)
{
bvl.MessageReplies = MessageReplies.ToList();
}
return View("RequestBooking", bvl);
}
View
<div id="partial">
@{
Html.RenderPartial("_MessagesView",Model);
}
</div>
Я бы хотел, чтобы сообщения Div загружались снова с новыми сообщениями, как только мы получим успех от обратного вызова jquery. Это возможно? Должен ли я написать свой HTML в своем веб-API для работы со списком и создания HTML из этого? Это будет грязное решение