到目前為止,已經介紹了很多屬於基礎建設的部份。從核心的DI用Autofac開始,再到那裡都使用的到的Log服務。再來介紹了ViewModel和如何透過框架來讓對應變得更加簡單。最後介紹了透過Repository 和 Unit of work,使得實際的DAL層級能夠被abstraction出來。
在這一篇,將會介紹比較偏向Controller層級的內容,也就是每一個application一定會使用到的:如何提供一種一致性的服務用於從Server傳遞訊息到客戶端?
如何從後端傳遞訊息到前端
所謂傳遞訊息到前端的意思是,通常來說每當一個功能執行完成之後,一定會提供一些feedback給user。例如,新增一筆資料成功,系統可能會用一個alert
訊息來顯示“新增成功”。
因為這個功能非常通用,因此Mvc裡面有一個特殊的儲存空間叫做TempData
。有別於ViewData
只能保存一次的request值到View裡面,TempData
底層也是用Session
來儲存,但是有別於Session
在,當TempData
的值被讀過,那一筆資料就會被清掉。
因此,TempData
非常適合用來存這一種一次性的feedback訊息,顯示完之後就不需要了。
使用TempData的難處
TempData
很適合存一次性資訊,但是實際在開發的時候不是那麼方便。在一個多人團隊開發的情況可能有以下幾個情況:
- 在沒有講好的情況下,每個人使用的
TempData
Key不一樣:開發者A可能使用message作為key,但是開發者B可能使用messages。 - 要設定錯誤訊息的時候不方便:
Action
裡面設定TempData
其實不是很好用。
因此這一次我們會建制一個AlertService
來提供一個好用的傳遞訊息的方式。
AlertService功能概念
基本上我們會先建立一個用來封轉要顯示在前端的訊息ViewModel。這個ViewModel只有兩個Property,一個是Message
:代表要顯示的訊息,還有一個是 AlertClass
:也就是這個訊息要顯示的樣式。
爲了能夠讓設定要傳遞的訊息更加簡單,將會建立一個AlertDecoratorActionResult
,這個特別的ActionResult只是讓設定訊息更加的方便。同時,爲了讓使用這個 ActionResult更加的方便,會在建立對應的4個Extension 方法,方便建立AlertViewModel
。
最後,會建立屬於View的部份,並且使用bootstrap的alert container
來顯示不同層級的訊息。
實作功能
有了上面的介紹,應該有了基本要建造的功能內容,就來看看如何實作。
AlertViewModel
首先先定義ViewModel的樣子:
AlertDecoratorActionResult和方便使用的4個Extension方法
首先是AlertDecoratorActionResult:
AlertDecoratorActionResult
基本上是實作了Decorator Pattern,基本上就是把實際要顯示的ActionResult包了一層,然後注入要顯示的訊息到TempData
。
TempData.AddAlert()
方法是客制的Extension方法,稍後會看到。 實際使用的時候不是很便利,因此會使用4個Extension方法來擴充,加上兩個方便存和取TempData裡面的Alert:
AddAlert
和GetAlerts
這兩個TempData的Extension,方便取得實際的Alert。最後Alert訊息是List的形態,讓我們可以擁有多筆Alert訊息。 View的部份
這邊會定義一個PartialView
叫做_Alert.cshtml,並且在_Layout
裡面render出來。
在_Layout.cshtml快到body的地方:
AlertViewModel.AlertClass
的值,搭配bootstrap,顯示有顏色的錯誤訊息,這個留個讀者去發揮。 如何使用
最後我們看一下會如何使用。
這個時候,只要新增成功,會導回首頁,並且顯示“新增成功”
結語
希望透過這一篇,讓未來在需要傳遞訊息到前端的時候變的更加方便。