私の会社では、Facebook と同様の通知バーを利用する請求システム用の Web アプリケーションを構築しています。これにより、ユーザーはシステム上のトランザクションのステータスを表示するメニューをドロップダウンでき、未処理のトランザクションの総数を表示できます。横に表示されます。詳細は画像をご覧ください。
http://img210.imageshack.us/img210/4379/alertdrop.png
ドロップダウン メニュー内のテーブルに次のコードを使用して、このデータを取得しています。
<table id="alertDropTable" style="margin-top:10px;">
@{
Dictionary<string, int> dic = ViewBag.statusCount;
if (dic != null)
{
for (int i = 0; i < dic.Count; i++)
{
if (dic.Values.ElementAt(i) > 0)
{
<tr>
<td width="100%" style="padding-bottom:4px; padding-top:4px; padding-left:10px; padding-right:10px; vertical-align:middle;">
You have <strong><a style="background-color:#878787; border-radius:5px; color:White; padding:3px;">@dic.Values.ElementAt(i)</a></strong> @dic.Keys.ElementAt(i) transaction(s).
</td>
</tr>
}
}
}
}
</table>
合計を表示するスパンについては、次のとおりです。
<div style="float: left;">
<a href="javascript:;" onmouseover="document.alert.src='@Url.Content("~/Content/images/alert_notification_hover.png")'" onmouseout="document.alert.src='@Url.Content("~/Content/images/alert_notification.png")'" onclick="toggle('notificationDrop');"><img src="@Url.Content("~/Content/images/alert_notification.png")" name="alert" alt="alert"/></a>
@{
Dictionary<string, int> dicheader = ViewBag.statusCount;
int diccount = 0;
if (dicheader != null)
{
for (int i = 0; i < dicheader.Count; i++)
{
if (dicheader.Values.ElementAt(i) > 0)
{
diccount = diccount + @dicheader.Values.ElementAt(i);
}
}
}
}
</div>
<div id="alertTotalDiv" style="float:left;margin-top:6px; margin-left:5px;"><span id="alertTotal" style="vertical-align:middle; background-color:#878787; border-radius:5px; color:White; font-family:Georgia; font-size:20px; padding:3px; padding-left:5px; padding-right:5px;margin-top:0px;">@diccount</span></div>
このコードは現在、グローバルな "_layout.cshtml" ファイルに格納されています。コードの粗さはご容赦ください。これは非常に初期のバージョンです。ただし、ページの読み込み時にデータを取得するという点では、これはうまく機能しています。ただし、システムでは、ページ全体を更新することなく、この情報を数秒ごとに自動的に更新する必要があります。要するに、コントローラを呼び出して現在のデータを戻し、現在の値で<table>
and<span>
を更新します。
「AlertController」からデータを取得し、それに応じてビューを更新する Ajax 関数を作成するように依頼されました。このコントローラの内容は次のとおりです。
public class AlertController : Controller
{
/// <summary>
/// Gets or sets the user service contract.
/// </summary>
/// <value>The user service contract.</value>
public IUserServiceContract UserServiceContract { get; set; }
/// <summary>
/// Initializes a new instance of the <see cref="BaseController"/> class.
/// </summary>
protected AlertController()
{
this.UserServiceContract = Gateway.Instance.Resolve<IUserServiceContract>();
}
/// <summary>
/// Get the AlertTypes
/// </summary>
/// <returns></returns>
public virtual void ViewAlerts()
{
Gateway.Instance.Logger.LogInfo(string.Format("Overview Controller View: Fetching list of alerts."));
try
{
if (this.UserServiceContract != null)
{
var allAnnouncements = this.UserServiceContract.GetAnnoucements();
var userAlertSettings = this.UserServiceContract.GetUserAlert();
ViewBag.statusCount = userAlertSettings;
ViewBag.announcements = allAnnouncements.ToList();
}
}
catch (Exception ex)
{
Gateway.Instance.Logger.LogInfo(ex);
throw new Exception(string.Format("Home Controller View Error: {0} occured while fetching alerts.", ex.Message), ex);
}
}
私は困惑していますが、私を助けるために、別のタスクを完全に実行するために使用される次の Ajax 関数の例が与えられています。
$.ajax({
url: '@Url.Action("ViewAlerts", "Alerts")',
data: { ownerIds: ownerIds },
traditional: true,
dataType: 'json',
success: function (result) {
for (i = 0; i < ownerIds.length; i++) {
$(".ownersTable tr[id='tablerow+" + ownerIds[i] + "']").remove();
}
},
error: function (xhr, ajaxOptions, thrownError) {
$("#confirmDiv").alertModal({
heading: '@Language.Fail',
body: '@Language.AlertRemoveOwnerFailed' + thrownError
});
}
});
これまでのところ、なんとか機能させることができたのは、5秒ごとにアラートを出す設定間隔機能だけでした!
これに関するガイダンスはありますか?