Я думаю, что приведенный ниже код может быть хорошей комбинацией различных ответов.Он использует веб-сервис для получения новых уведомлений и JQuery для извлечения уведомлений на интервале.Он хранит уведомления в сеансе пользователя.
Во-первых, наш простой класс «Message», который представляет одно сообщение.В вашем вопросе я заметил, что у вас будет несколько типов сообщений, поэтому я хотел бы обеспечить решение, которое охватывает это.Мой класс сообщений имеет только два свойства: текст и тип.Тип, в моей демонстрации, используется в качестве цвета фона сообщения.
public class Message
{
public string Text { get; set; }
public string Type { get; set; }
}
Далее следует наш класс UserMessages, который обрабатывает сохранение и поиск сообщений.Он сохраняет все сообщения в пользовательском сеансе.
public class UserMessages
{
protected static string _messageSessionID = "userMessages";
public static List<Message> GetMessages()
{
var msg = HttpContext.Current.Session[_messageSessionID];
if (msg == null)
{
return new List<Message>();
}
//clear existing messages
HttpContext.Current.Session[_messageSessionID] = null;
//return messages
return (List<Message>)msg;
}
public static void AddMessage(Message message)
{
var msg = GetMessages();
msg.Add(message);
HttpContext.Current.Session[_messageSessionID] = msg;
}
}
Для своей демонстрации я решил прочитать сообщения, используя AJAX, объединив веб-сервис ASP.Net, ScriptManager и jquery.Вот мой веб-сервис:
- Файл ASMX -
<%@ WebService Language="C#" CodeBehind="~/App_Code/MessageService.cs" Class="UserNotification.MessageService" %>
- Файл CS -
namespace UserNotification
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class MessageService : System.Web.Services.WebService
{
public MessageService()
{
}
[WebMethod(EnableSession = true)]
public List<Message> GetMessages()
{
return UserMessages.GetMessages();
}
}
}
На моей странице aspx я создал скрипт-менеджер сссылка на мой сервис, местозаполнитель div для сообщений и интерфейс быстрого и грязного добавления сообщений:
<asp:ScriptManager runat="server">
<Services>
<asp:ServiceReference Path="~/MessageService.asmx" />
</Services>
</asp:ScriptManager>
<div>
<div id="msgArea">
</div>
<span>Add Message</span>
Text: <asp:TextBox ID="txtMessage" runat="server" />
<br />
Type: <asp:TextBox ID="txtType" runat="server" Text="yellow" />
<asp:Button ID="btnAdd" runat="server" Text="Add" onclick="btnAdd_Click" />
</div>
</form>
Для поддержки создания сообщений в код добавлен следующий метод для обработки события нажатия кнопки:
protected void btnAdd_Click(object sender, EventArgs e)
{
UserMessages.AddMessage(new Message() {Text = txtMessage.Text, Type = txtType.Text});
}
Теперь о важной части.Для реального отображения сообщений я написал следующий блок javascript (используя в основном jquery, я использовал v1.4.1, но вы можете использовать любую версию, какую пожелаете).Таймер установлен с интервалом 30 секунд.Это означает, что он также ожидает 30 секунд перед первой обработкой.Чтобы сразу обработать загрузку страницы, добавьте CheckMessages();
прямо перед setInterval, чтобы выполнить немедленную проверку загрузки страницы.Выход из setInterval позволит периодически обновлять сообщения.
<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
setInterval('CheckMessages();', 30000);
});
function CheckMessages() {
UserNotification.MessageService.GetMessages(function (result) {
//alert('found ' + result.length.toString() + ' messages.');
$.each(result, function (i, e) {
var dv = $('<div />')
.css('background-color', e.Type)
.css('border', '4px solid white')
.css('color', 'white')
.css('text-align', 'center')
.append('<span>' + e.Text + '</span>')
.append(
$('<button />')
.text('Close')
.click(function () { $(this).parent().remove(); }));
$('#msgArea').append(dv);
});
}, function (e) { alert(e._message); });
}
</script>
Обратите внимание, что в приведенном выше блоке кода я использую e.Text, который соответствует имени нашего свойства в коде, и e.Type.e.Type - это наш заданный цвет фона, но он, вероятно, будет использоваться для чего-то другого в реальной жизни.Кроме того, в реальной жизни все эти атрибуты CSS были бы в классе CSS (вероятно, один класс CSS для каждого типа сообщения).Я добавил кнопку «Закрыть», вы не упомянули об этом, но я подумал, что люди захотят иметь возможность закрыть уведомления.
Одна классная вещь в этой реализации - то, что в будущем вы понимаете, что вам нужночтобы хранить сообщения НЕ в сеансе, а, скажем, в базе данных, эта реализация будет обрабатывать его гладко.Просто измените UserMessages.GetMessages, чтобы вытащить из БД / другое место, и все готово.Кроме того, вы можете настроить его для обработки глобальных сообщений, читая их из кэша в дополнение к чтению пользовательских сообщений из сеанса.