以下のコードは、さまざまな回答の良い組み合わせかもしれないと思います。 Webサービスを使用して新しい通知を取得し、jqueryを使用してある間隔で通知を取得します。ユーザセッションに通知を保存します。
まずは、メッセージを表す単純な「Message」クラスを最初に使用します。あなたの質問では、複数の種類のメッセージがあることに気付きましたので、私はそれをカバーするソリューションを提供したいと思っていました。私のメッセージクラスは、TextとTypeという2つのプロパティしか持っていません。タイプは、私のデモでは、メッセージの背景色として使用されます。
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サービスは、次のとおりです。
私のaspxページで
--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();
}
}
}
私は私のサービスに関連しての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>
メッセージ作成をサポートするために、彼はボタンのクリックイベントを処理するコードの背後にあるメソッドに従っています:
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秒待つことを意味します。ページのロードを直ちに処理するには、setIntervalの直前にCheckMessages();
を追加して、ページのロードを即座にチェックします。 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クラス(おそらく各メッセージタイプごとに1つのCSSクラス)に含まれます。私は「閉じる」ボタンを追加しましたが、あなたは言及しませんでしたが、人々は通知を閉じたいと思っていました。
この実装についてのすばらしい点の1つは、セッションの途中ではなく、データベースにメッセージを格納する必要があることを実現していることです。この実装ではスムーズに処理されます。 UserMessages.GetMessagesを変更してdb/otherの場所から取得すると、設定されます。さらに、セッションからユーザーメッセージを読み込むだけでなく、キャッシュからメッセージを読み取ってグローバルメッセージを処理するように設定することもできます。
http://msdn.microsoft.com/en-us/library/ms972429.aspxこのようにSession.Add( "Notificiations"、myList);その「通知」リストを初期化してどこにでも追加する方法はありますか? – tester
@テスター:以前の回答にいくつかのコードを追加しました – citronas
素晴らしいです。これは 'Session''HttpContext.Current.Session'を作ったときにうまくいきました。ありがとう! – tester