2011-06-20 22 views
8

還有一點新的c#和我需要一些指針正確的方向與此..我將如何去創建一個全局通知類?

我想建立一個通知系統在C#/ Asp.net,將允許不同的方法遍及整個網站將消息和消息類型添加到可在下一頁加載時循環的某個靜態列表。這與堆棧溢出如何在每個頁面上加載成就的橫幅通知相似(例如,「您贏得了x徽章」,您贏得了「徽章」)。任何想法我如何可能公開一些其他人可能發出的全局方法消息。加(「消息」,「消息類型」)與

編輯:?

它已經建議我用Session.Add("Notificiations", myList);來存儲信息

如何/我哪裏會去初始化該「通知「list然後在其他地方做list.add()?

回答

6

你可以寫一個這樣的類(我沒有任何我DE靠近我,所以我希望代碼將編譯):

public class MessageHelper 
{ 
    protected const String sessionName = "messages_session"; 
    public List<String> Messages 
    { 
     get 
     { 
      List<string> list; 
      if (Session[sessionName] != null) 
      { 
       list = (List<string>)Session[sessionName]; 
      } 
      else 
      { 
       list = new List<string>(); 
      } 
      Session[sessionName] = list; 
      return list; 
     } 
     set 
     { 
      Session[sessionName] = value; 
     } 
    } 

    public void AddMessage(String message) 
    { 
     List<String> list = this.Messages; 
     list.Add(message); 
     this.Messages = list; 
    } 

} 

要添加一個消息,你會怎麼做:

MessageHelper messageHelper = new MessageHelper(); 
messageHelper.AddMessage("hello world"); 

(這些消息存儲在會話中,這意味着用戶特定的);

讓我們假設你有你的母版,在那裏你想顯示的消息文字:

<asp:Literal ID="litMessages" runat="server" /> 

在你的母版將添加OnInit Eventhandler

protected override void OnInit(EventArgs e) 
{ 
    MessageHelper messageHelper = new MessageHelper(); 
    String output = string.Empty; 
    foreach(String message in messageHelper.Messages) 
    { 
    output += String.Format("{0}<br />", message); 
    } 
    this.litMessages.Text = output; 

} 

這應該給你一個基本概述,您可以如何存儲和顯示消息。當然,你可以通過添加一個刪除消息的方法或者很好的客戶端副作用來調整這些代碼(比如StackOverflow中的通知),爲了找出這個過程如何完成,可以使用搜索,這裏已經討論了幾個次)

我希望這可以幫助你。

+0

http://msdn.microsoft.com/en-us/library/ms972429.aspx所以像Session.Add( 「Notificiations」,myList中);我將如何去初始化「通知」列表並將其附加到其他地方? – tester

+0

@tester:我添加了一些代碼,我以前的答案 – citronas

+0

真棒。當我創建'Session'' HttpContext.Current.Session'時,結果很好。謝謝! – tester

9

在回發頁面頂部顯示彈出式橫幅是非常整潔的,但比使用jQuery和ajax定期檢查服務器以查看某些事情的狀態是否已更改或更酷如果用戶有任何「新」消息。

當你在Web服務器上運行一些異步進程,並且你不知道需要多長時間(或者你肯定知道需要很長時間),這真的很棒,所以你不希望客戶的瀏覽器被捆綁在等待中。使用javascript和window.setInterval你可以設置一個函數每30秒發生一次(或者你喜歡的任何事情),然後你說函數對服務器做了一個ajax post,看看異步過程是否完成。在你的情況下,ajax文章只是詢問服務器用戶是否有任何「新」消息。如果用戶確實有新消息,那麼使用jQuery在頁面上顯示一些隱藏的div會很簡單,通知用戶他們有新消息。

這是一個複雜的解決方案,可能超出了業餘愛好者的技能,但收穫是值得的!

  • 讓你的web應用程序看起來更加有狀態和服務器
  • 與不必要的頁面刷新,往往會破壞用戶體驗

正如其他人已經指出的分配上變化的「感知」,存儲「全球」信息的最佳地點通常是會議(請注意會議的有限範圍)。 MSDN ASP.NET Session State

但是,如果是需要由每個客戶端訪問的數據,則可以將其存儲在應用程序Cache中。 ASP.NET Caching

當然,您需要謹慎考慮您在Session或Cache中存儲的存儲容量。在腳下輕鬆拍攝自己很容易。

1

我建議將其定義爲可以被實現爲WCF/Web服務或您的Web應用程序內的接口的服務。

擁有的服務有幾個好處,包括可擴展性,可用性等。作爲一個例子此功能,使用您的iPhone應用程序客戶端發送消息並使用你的網站的另一個客戶端可以看到。

,如果你喜歡的第二個辦法,你需要使用DI框架如Ninject並確保DI/IoC框架上的實例應用Singleton模式。

在這裏我可以給你一個示例代碼,但我不能這樣做,直到我回家。

+0

很想看例子! – tester

1

我想我有下面的代碼可能是不同的答案的良好結合。它使用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以從數據庫/其他位置進行提取並設置即可。另外,除了讀取會話中的用戶消息之外,您還可以通過從緩存中讀取全局消息來設置它。

相關問題