در ادامه میخواهیم اعلام عمومی نمایش افزوده شدن یک پیام جدید را بعد از ثبت رکوردی جدید، به تمامی کاربران متصل به سیستم ارسال کنیم. پیش نیاز مطلب جاری موارد زیر میباشند:
در اینجا مدل ما شامل عنوان، توضیح، قیمت و یک enum برای دستهبندی یک محصول ساده میباشد.
همانطور که در ابتدا عنوان شد، میخواهیم بعد از ثبت یک رکورد جدید، پیامی عمومی به تمامی کاربران متصل به سایت نمایش داده شود. در کد زیر اکشن متد Create را مشاهده میکنید:
میتوانیم از ViewBag برای اینکار استفاده کنیم؛ به طوریکه یک پارامتر از نوع bool برای متد Index تعریف کرده و سپس مقدار آن را درون این شیء ViewBag انتقال دهیم، این متغییر بیانگر حالتی است که آیا اطلاعات جدیدی برای نمایش وجود دارد یا خیر؟ بنابراین اکشن متد Index را به اینصورت تعریف میکنیم:
در اینجا مقدار پیشفرض این متغیر، false میباشد. یعنی اطلاعات جدیدی برای نمایش موجود نمیباشد. در نتیجه اکشن متد Create را به صورتی تغییر میدهیم که بعد از درج رکورد موردنظر و هدایت کاربر به صفحهی Index، مقدار این متغییر به true تنظیم شود:
قدم بعدی ایجاد یک هاب SignalR میباشد:
در ادامه کدهای سمت کلاینت را برای هاب فوق، داخل ویوی Index اضافه میکنیم:
همانطور که در کدهای فوق مشاهده میکنید، بعد از اینکه اتصال با موفقیت برقرار شد (درون متد done) شرط چک کردن متغییر NotifyUsers را بررسی کردهایم. یعنی در این حالت اگر مقدار آن true بود، متد درون هاب را فراخوانی کردهایم. در نهایت پیام به یک div با آیدی result اضافه شده است.
ابتدا مدل زیر را در نظر داشته باشید:
namespace ShowAlertSignalR.Models { public class Product { public int Id { get; set; } public string Title { get; set; } public string Description { get; set; } public float Price { get; set; } public Category Category { get; set; } } public enum Category { [Display(Name = "دسته بندی اول")] Cat1, [Display(Name = "دسته بندی دوم")] Cat2, [Display(Name = "دسته بندی سوم")] Cat3 } }
کلاس context نیز به صورت زیر میباشد:
namespace ShowAlertSignalR.Models { public class ProductDbContext : DbContext { public ProductDbContext() : base("productSample") { Database.Log = sql => Debug.Write(sql); } public DbSet<Product> Products { get; set; } } }
[HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(Product product) { if (ModelState.IsValid) { db.Products.Add(product); db.SaveChanges(); return RedirectToAction("Index"); } return View(product); }
public ActionResult Index(bool notifyUsers = false) { ViewBag.NotifyUsers = notifyUsers; return View(db.Products.ToList()); }
[HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(Product product) { if (ModelState.IsValid) { db.Products.Add(product); db.SaveChanges(); return RedirectToAction("Index", new { notifyUsers = true }); } return View(product); }
namespace ShowAlertSignalR.Hubs { public class NotificationHub : Hub { public void SendNotification() { Clients.Others.ShowNotification(); } } }
@section scripts { <script src="~/Scripts/jquery.signalR-2.0.2.min.js"></script> <script src="~/signalr/hubs"></script> <script> var notify = $.connection.notificationHub; notify.client.showNotification = function() { $('#result').append("<div class='alert alert-info alert-dismissable'>" + "<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>×</button>" + "رکورد جدیدی هم اکنون ثبت گردید، برای مشاهده آن صفحه را بروزرسانی کنید" + "</div>"); }; $.connection.hub.start().done(function() { @{ if (ViewBag.NotifyUsers) { <text>notify.server.sendNotification();</text> } } }); </script> }
لازم به ذکر است برای حالتهای حذف و بهروزرسانی نیز روال کار به همین صورت میباشد.
سورس مثال جاری : ShowAlertSignalR.zip
سورس مثال جاری : ShowAlertSignalR.zip