我想我有下面的代碼可能是不同的答案的良好結合。它使用Web服務來檢索新的通知和jQuery,以間隔的方式提取通知。它將通知存儲在用戶會話中。第一
第一件事,我們的簡單的「消息」類表示單個消息。我注意到你的問題,你會有多種類型的消息,所以我想確保提供一個解決方案。我的消息類只有兩個屬性:文本和類型。在我的演示中,類型用作消息的背景顏色。
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;
}
}
對於我的演示,我決定通過結合一個ASP.Net Web服務,的ScriptManager和jQuery讀取使用AJAX的messaages。這裏是我的web服務:
--ASMX File--
<%@ WebService Language="C#" CodeBehind="~/App_Code/MessageService.cs" Class="UserNotification.MessageService" %>
--CS File--
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頁面我創建了一個ScriptManager用我的服務的引用,一個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>
爲了支持消息創建,我添加了t他在代碼後面用下面的方法來處理按鈕單擊事件:
protected void btnAdd_Click(object sender, EventArgs e)
{
UserMessages.AddMessage(new Message() {Text = txtMessage.Text, Type = txtType.Text});
}
現在是重要的一塊。要進行實際的顯示消息的我寫的JavaScript以下塊(使用jQuery的大部分,我使用1.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以從數據庫/其他位置進行提取並設置即可。另外,除了讀取會話中的用戶消息之外,您還可以通過從緩存中讀取全局消息來設置它。
http://msdn.microsoft.com/en-us/library/ms972429.aspx所以像Session.Add( 「Notificiations」,myList中);我將如何去初始化「通知」列表並將其附加到其他地方? – tester
@tester:我添加了一些代碼,我以前的答案 – citronas
真棒。當我創建'Session'' HttpContext.Current.Session'時,結果很好。謝謝! – tester